【问题标题】:How to combine duplicate object value in the array then output a list?如何在数组中合并重复的对象值然后输出一个列表?
【发布时间】:2019-10-24 06:35:10
【问题描述】:

我一直在研究这几个小时并在谷歌周围搜索,看到很多删除重复的示例,但没有合并值。所以我希望有人可以在这里帮助我。

我想检查 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)

非常感谢您的帮助!

【问题讨论】:

    标签: javascript sorting filter reduce


    【解决方案1】:
    var new_array = arr.map(function callback(currentValue[, index[, array]]) {
        // Return element for new_array
    }[, thisArg])
    

    Array​.prototype​.map() 的回调函数的前两个参数是 currentValue,即数组的项,第二个值是它的索引,而不是 prev 和 next 元素。

    你要找的是这样的东西。

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

    我将解决方案分为两个步骤,即对象的组合和重建,以便您可以清楚地看到正在发生的事情。

    我强烈建议您参考documentation for reduce 方法以了解其工作原理

    【讨论】:

    • 看起来你需要Number而不是parseInt - 注意第二个橙子的价格。
    • 很高兴看到@georg。我将进行编辑
    • 非常感谢您对我的问题的快速回答,您的代码很有意义,我会研究更多的 reduce 函数。再次感谢!
    【解决方案2】:

    这会起作用。您可以在 Find 中使用 reduce。

    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)

    【讨论】:

    • 非常感谢您回答我的问题,这是解决我遇到的问题的一种非常酷的方法,不知道我可以在 if else 语句中运行过滤器功能。今天学习一个新东西! :)
    猜你喜欢
    • 2021-12-10
    • 2017-02-14
    • 2019-12-20
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 2021-11-12
    • 1970-01-01
    • 2015-03-27
    相关资源
    最近更新 更多