Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   Promise.all + array.map (https://javascript.ru/forum/css-html/85357-promise-all-array-map.html)

fori 10.07.2023 16:30

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 а не массив

voraa 10.07.2023 16:51

Я не хрена не понял, зачем тут Pomise, async, await
НО
Цитата:

Метод Promise.all(iterable) возвращает промис,....
https://developer.mozilla.org/ru/doc...BD%D0%B8%D0%B5
Что вызвали, то и получили

fori 10.07.2023 16:54

Сделал версию на 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);

voraa 10.07.2023 17:47

Чего мучаться?
Сначала отфильтровать, потом оптимизировать
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();


Часовой пояс GMT +3, время: 19:56.