Как объединить дублирующее значение объекта в массиве и вывести список? - PullRequest
4 голосов
/ 09 июня 2019

Я работал над этой парой часов и гуглил, см. Много примеров удаления дубликатов, но не суммировал значение.так что я надеюсь, что кто-то может помочь мне здесь.

Я хочу проверить, что item.name совпадает, затем добавить цену вместе, затем нажать на новый массив списка.

const items = [
  { name: 'apple',      price: '10' },
  { name: 'banana',     price: '1' },
  { name: 'orange',     price: '2' },
  { name: 'apple',      price: '5' },
  { name: 'orange',     price: '2.5' },
  { name: 'banana',     price: '3' },
  { name: 'strawberry', price: '7' },
  { name: 'apple',      price: '12' }
]

let newItem = []
const checkItem = items.map((prev, next) => {
  if (prev.name === next.name) {
    return newItem.push = {
      name: next.name,
      value: parseInt(prev.price) + parseInt(next.price)
    }
  }
});

console.log(newItem)

Большое спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 09 июня 2019
var new_array = arr.map(function callback(currentValue[, index[, array]]) {
    // Return element for new_array
}[, thisArg])

Первые два аргумента функции обратного вызова Array​.prototype​.map(): currentValue т.е. элемент массива и второе значение - это его индекс, а не prev и следующие элементы.

Что вы ищетеэто что-то вроде этого.

const items = [
  { name: "apple", price: "10" },
  { name: "banana", price: "1" },
  { name: "orange", price: "2" },
  { name: "apple", price: "5" },
  { name: "orange", price: "2.5" },
  { name: "banana", price: "3" },
  { name: "strawberry", price: "7" },
  { name: "apple", price: "12" }
];

const combine = items.reduce((acc, item) => {
  if (acc[item.name] !== undefined) {
    acc[item.name] += Number(item.price);
  } else acc[item.name] = Number(item.price);
  return acc;
}, {});

const fruitKeys = Object.keys(combine);

newItem = fruitKeys.map(item => ({ name: item, price: combine[item] }));

console.log(newItem);

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

Я настоятельно рекомендую вамчтобы обратиться к документации по методу Reduce , чтобы понять, как он работает

0 голосов
/ 09 июня 2019

Это сработает. Вы можете использовать уменьшение с помощью Find.

const items = [{
    name: 'apple',
    price: '10'
  },
  {
    name: 'banana',
    price: '1'
  },
  {
    name: 'orange',
    price: '2'
  },
  {
    name: 'apple',
    price: '5'
  },
  {
    name: 'orange',
    price: '2.5'
  },
  {
    name: 'banana',
    price: '3'
  },
  {
    name: 'strawberry',
    price: '7'
  },
  {
    name: 'apple',
    price: '12'
  }
]

let result = items.reduce((acc, el) => {
  if (acc.filter(ele => ele.name == el.name).length == 0) {
    acc.push(el);
  } else {
    let filtered = acc.find(ele => ele.name == el.name)
    filtered.price = parseFloat(filtered.price) + parseFloat(el.price);
}
return acc;

}, [])

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