Javascript: Как использовать Reduce для получения нового массива объектов - PullRequest
0 голосов
/ 28 июня 2018

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

pieArr = [blueberry, strawberry, pumpkin, apple]

Я хочу создать массив объектов, который отображает общую сумму корзины покупок в зависимости от цены на пирог, и кто-то здесь при переполнении стека рекомендовал использовать уменьшение.

Это то, что я имею до сих пор:

var total = 0;

const totalArr = pieArr.reduce((totalPrice, pie) => {
  if ( pie === "blueberry") {
    total += 2.5;
    totalPrice.push({["cartTotal"]:total});
    return totalPrice;
  }
 else if (pie === "apple") {
   total += 2;
   totalPrice.push({["cartTotal"]:total});
   return totalPrice;
 }, 
 [])};

Я хочу, чтобы конечный результат был новым массивом объектов, который продолжает добавлять новые итоги:

[{cartTotal:2.5},{cartTotal:4.5}]

Создается новый массив объектов, но общее количество не суммируется, поэтому в обоих случаях общее число равно 0:

[{cartTotal: 0},{cartTotal: 0}]

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

const total = 0;
let pieArr = ['blueberry', 'strawberry', 'pumpkin', 'apple']
const totalArr = pieArr.reduce((totalPrice, pie) => {
  let foundPie = totalPrice.find(x => x.name === pie) || {name: pie, total: 0};
  
 if ( pie === "blueberry") {
    foundPie.total += 2.5;
 }
 else if (pie === "apple") {
   foundPie.total += 2;
 }
 
 if(!totalPrice.some(x=>x.name === pie)){
   totalPrice.push(foundPie)
 }
  return totalPrice;
}, []);

console.log(totalArr)

Я бы рекомендовал добавить еще один атрибут name для более четкого изображения. пока мы reducing, находим круговую диаграмму из накопленного массива totalPrice, затем выполняем суммирование и проверяем, нужно ли поместить элемент в накопленный массив

0 голосов
/ 28 июня 2018

Хороший способ сделать это - посмотреть цену как:

let piePrices = {
    blueberry: 2.25,
    strawberry: 1.5, 
    pumpkin: 3,
    apple: 2
}

Тогда вы можете использовать это в map() (что лучше, чем reduce(), если вы просто делаете массив из массива) без всего шума if/else:

let piePrices = {
    blueberry: 2.25,
    strawberry: 1.5, 
    pumpkin: 3,
    apple: 2
}

let pieArr = ['blueberry', 'strawberry', 'pumpkin', 'apple']

let total = 0
let totalPrice = pieArr.map(pie =>  ({cartTotal: total += piePrices[pie]}))

console.log(totalPrice)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...