Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 10.07.2023, 16:30
Кандидат Javascript-наук
Отправить личное сообщение для fori Посмотреть профиль Найти все сообщения от fori
 
Регистрация: 27.01.2021
Сообщений: 117

Promise.all + array.map
Здравствуйте, у меня есть массив стран, мне нужно отфильтровать и запушить туда измененные фрагменты
так как надо сделать и filter и map использою reduce
let countries = [{
    iso: "ca",
    flag: "<svg></svg>"
}, {
    iso: "us"
}, {
    iso: "an"
}]
async function optimizeSVG(str) {
    return await str;
}

let result = Promise.all(countries.reduce(async (filtered, country) => {
    const countriesToIgnore = ['an']
    if (!countriesToIgnore.includes(country.iso)) {
        flag = await optimizeSVG(country.flag)
        filtered.push(await [country.iso, flag || 'noflag'])
    }
    return await filtered
}, []))
console.log(result)

однако в результат возращается object promise а не массив
Ответить с цитированием
  #2 (permalink)  
Старый 10.07.2023, 16:51
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,745

Я не хрена не понял, зачем тут Pomise, async, await
НО
Цитата:
Метод Promise.all(iterable) возвращает промис,....
https://developer.mozilla.org/ru/doc...BD%D0%B8%D0%B5
Что вызвали, то и получили
Ответить с цитированием
  #3 (permalink)  
Старый 10.07.2023, 16:54
Кандидат Javascript-наук
Отправить личное сообщение для fori Посмотреть профиль Найти все сообщения от fori
 
Регистрация: 27.01.2021
Сообщений: 117

Сделал версию на array.map
let countries = [
  {
    iso: "ca",
    flag: "<svg></svg>"
  },
  {
    iso: "us"
  },
  {
    iso: "an"
  }
];

async function optimizeSVG(str) {
  return str;
}

async function filterCountries() {
  const countriesToIgnore = ['an'];

  let result = await Promise.all(countries.map(async (country) => {
    if (!countriesToIgnore.includes(country.iso)) {
      let flag = await optimizeSVG(country.flag);
      return [country.iso, flag || 'noflag'];
    }
  }));

  result = result.filter(Boolean);
  console.log(result);
}

filterCountries();

но можно ли без result = result.filter(Boolean);
Ответить с цитированием
  #4 (permalink)  
Старый 10.07.2023, 17:47
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,745

Чего мучаться?
Сначала отфильтровать, потом оптимизировать
let countries = [
  {
    iso: "ca",
    flag: "<svg></svg>"
  },
  {
    iso: "us"
  },
  {
    iso: "an"
  }
];
 
async function optimizeSVG(str) {
  return str;
}
 
async function filterCountries() {
	const countriesToIgnore = ['an'];
	const filtered = countries.filter(country => !countriesToIgnore.includes(country.iso))
	let result = await Promise.all(filtered.map(async (country) => {
		let flag = await optimizeSVG(country.flag);
		return [country.iso, flag || 'noflag'];
	}));
 
  console.log(result);
}
 
filterCountries();
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Интересная штука с Promise.all kvizor34 AJAX и COMET 4 13.09.2018 22:18
Работа с array.map Sinevik Общие вопросы Javascript 3 20.12.2017 18:29
custom Array.map Anna_Medvid Общие вопросы Javascript 1 11.10.2017 23:53
Array.map WHAT THE FUCK?! livelover Общие вопросы Javascript 2 27.02.2016 01:29