Javascript - 计算 es6 中具有许多字段的对象数组中的重复项

标签 javascript ecmascript-6

我有这样的对象数组。

const array = [ { x: 1, y: 2 }, { x: 3, y: 4 }, { x: 1, y: 2 }, { x: 3, y: 4 }, { x: 1, y: 2 }, { x: 3, y: 12 } ]

我想计算重复对象并将计数存储为新对象字段。

我找到了这个片段,它工作得很好,但它并不是我所需要的。

const names = [{  _id: 1 }, { _id: 1}, { _id: 2}, { _id: 1}]

    const result = [...names.reduce( (mp, o) => {
    if (!mp.has(o._id)) mp.set(o._id, Object.assign({ count: 0 }, o));
    mp.get(o._id).count++;
    return mp;
    }, new Map).values()];

    console.log(result);

它适用于具有一个字段 _id 的对象。在我的例子中有两个,x 和 y

我应该如何修改该代码?

简而言之...我想收到结果:

result = [ { x: 1, y: 2, count:3 }, { x: 3, y: 4, count:2 }, { x: 3, y: 12, count:1 } ]

最佳答案

您可以使用 Object.values()reduce() 方法返回新的对象数组。

const array = [ { x: 1, y: 2 }, { x: 3, y: 4 }, { x: 1, y: 2 }, { x: 3, y: 4 }, { x: 1, y: 2 }, { x: 3, y: 12 } ]

const result = Object.values(array.reduce((r, e) => {
  let k = `${e.x}|${e.y}`;
  if(!r[k]) r[k] = {...e, count: 1}
  else r[k].count += 1;
  return r;
}, {}))

console.log(result)

这是使用 Map 和扩展语法 ... 的解决方案

const array = [ { x: 1, y: 2 }, { x: 3, y: 4 }, { x: 1, y: 2 }, { x: 3, y: 4 }, { x: 1, y: 2 }, { x: 3, y: 12 } ]

const result = [...array.reduce((r, e) => {
  let k = `${e.x}|${e.y}`;
  if(!r.has(k)) r.set(k, {...e, count: 1})
  else r.get(k).count++
  return r;
}, new Map).values()]

console.log(result)

关于Javascript - 计算 es6 中具有许多字段的对象数组中的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47774696/

相关文章:

javascript - 使用 extends 子类化 Promise 内置

javascript - 使用 reduce to group date 来制作 date_from 和 date_to

javascript - Ajax 表单验证的优点和缺点

javascript - 启用禁用自定义右键菜单

javascript - Mobile Safari 10 IndexedDB Blob

javascript - 从 catch block 中获取 “Uncaught (in promise) Error”

javascript - es6调用扩展组件函数

javascript - 你如何使用 jQuery 写入跨度?

javascript - 当日期为 MM/DD/YYYY HH :mm:ss 时,moment.js 返回意外的 fromNow 日期

javascript - reduce 函数不会将累加器初始化为零?