#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);
})
}
}