javascript - 如何合并数组中的重复对象值然后输出列表?

标签 javascript sorting filter reduce

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

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

非常感谢您的帮助!

最佳答案

这会起作用。您可以将 reduce 与 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)

关于javascript - 如何合并数组中的重复对象值然后输出列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56516569/

相关文章:

javascript - 在 Chrome 应用程序中重用 UDP 套接字的地址

javascript - cookie 是否可以保护 token 免受 XSS 攻击?

javascript - 当用户在输入栏中键入内容时过滤表格

javascript - Array.filter 数字加零

javascript - 使用 jquery 强制浏览器在单击链接时下载图像

javascript - 我可以在 Vue.js 中的 <tr> 内使用 <tr> 标签吗?

java - 是否可以以排序的方式获取类字段?

sorting - 表键排序不正确

sorting - ElasticSearch的地理距离排序中使用的 `unit`设置是什么?

javascript - AngularJS ng-grid 过滤器 -- filterText 格式