отфильтруйте значение данных сбора обещание

#javascript

Вопрос:

Здравствуйте, я хочу отфильтровать значения, обещаю, что у меня есть этот идентификатор массива

 ids= [
       [234, 235, 236],
       [237, 238, 239, 240],
       [241, 242, 243, 244, 245]]
 

У меня есть эта функция, она возвращает товары и цены, я зацикливаю все идентификаторы товаров в обещании получить цену сбора по каждому идентификатору

 async getPricesAndProducts() {
      const Products = this.idProducts;
      const ids = this.ids;
      let promisesPrices = [];
      const app = { $axios: this.$axios };
      const promisesProducts = Products.map((product) =>
        endPoint.getProducts(app, product)
      );
      for (let i = 0; i < ids.length; i  ) {
        for (let y = 0; y < ids[i].length; y  ) {
          promisesPrices.push(endPoint.getPrices(app, ids[i][y])); // collection prices 
        }
      }
      return await Promise.all([promisesProducts, promisesPrices]);
    }
 

когда я в цикле, моя коллекция похожа на этот пример

 prices= [
       {id: 234, price: 123},
       {id: 235, price: 567},
       {id: 236, price: 567},
       {id: 237, price: 456},
       {id: 238, price: 678},
       {id: 239, price: 234},
       {id: 240, price: 432},
       {id: 241, price: 430},
       {id: 232, price: 460},...]
 

Я хочу вернуть минимальную цену в результате обещания для каждого массива пример ожидаемого результата

 promisesPrices= [
            {id:234, price: 123} // min price ids  [234, 235, 236],
            {id:239, price: 234}, // min price ids [237, 238, 239, 240],
            {id: 241 price: 430} // min price ids  [241, 242, 243, 244, 245]
           ]
 

Я сделаю это внутри Обещания.все, кроме того, что не работает, У меня есть ошибка этого
типа: обещает.тогда это не функция

 return await Promise.all([promisesProducts, promisesPrices.then((res) => {
          res.reduce((prev, curr) => (prev.price < curr.price ? prev : curr));
        })
       ]);
 

Пожалуйста, помогите мне

Комментарии:

1. Обещания-это набор обещаний, верно? В массиве не будет a .then .

2. Аргументом to Promise.all() должен быть массив обещаний. [promisesProducts, promisesPrices] представляет собой 2-мерный массив обещаний.

Ответ №1:

Я бы начал с создания массива объектов продукта…

 const ids= [ [234, 235, 236], [237, 238, 239, 240], [241, 242, 243, 244, 245] ];

// create a structure like this: { 234: { id: 234 }, 235: { id: 235 }, ... 
const products = ids.flat().reduce((acc, id) => {
  acc[id] = { id };
  return acc;
}, {}); 
 

Затем я бы построил (и протестировал!) функцию, которая возвращает обещание установить цены на данный продукт…

 function updatePrice(product) {
  const app = { $axios: this.$axios };
  return endPoint.getPrices(app, product.id).then(result => {
    product.price = result.price;  // however you do this
  })
}
 

Я пропустил ваши звонки endPoint.getProducts для массива, из которого вы получаете this.idsProducts . ОП упоминает об этом в коде, но не было ясно, как используются эти результаты.

Теперь вы находитесь в хорошем положении, чтобы получить все цены…

 function getPricing() {
  const promises = Object.values(products).map(updatePrice);
  return Promise.app(promises);
}
 

С этим мы подходим к тому, чтобы задать оригинальный вопрос: как получить минимальную цену в каждой группе. Проблема должна быть проще, так как мы больше не путаемся с асинхронным кодом…

 function getMinPrices() {
  return getPricing().then(() => {
    // now products is { 234: { id: 234, price: 123 }, ...
    const groupedByIds = ids.map(idArray => { // idArray is the inner ids array
      return idArray.map(id => products[id])
    })
    // so groupedByIds are the priced products grouped according to the id array
    // minimums are just a reduce on the inner arrays
    const minPricedProducts = groupedByIds.map(group => {
      // answer the member of group with the minimum price
      return group.reduce((acc, p) => acc.price < p.price ? acc : p);
    })
  }
}