如何使用有关计数的信息获取对象数组中相同数据的计数

How to get the count of same data in array of object with the info about number of count

假设我有一个对象数组 arr1

arr1 = [{name: "name1",id: 1},{name: "name2",id: 1},{name: "name3",id: 4},{name: "name3",id: 3},{name: "name1",id: 5}]

我想要数组或对象形式的具有相同id的计数信息。

我尝试使用 for loop 、 map 和 Lodash 获取信息。 我得到了结果。但是想要以任何有效的方式做到这一点。

我的工作代码

const arr1 = [{name: "name1",id: 1},{name: "name2",id: 1},{name: "name3",id: 4},{name: "name3",id: 3},{name: "name1",id: 5}];

const arr2 = []
for (var i = 0; i < arr1.length; i++) {
  var obj = {}
  _.keys(arr1[i]).map(o => {
    obj[o] = arr1[i][o]
    obj["count"] = arr1.filter(a => {
      return a.id === arr1[i].id
    }).length
  })
  arr2.push(obj)
}
var arr3 = _.uniqBy(arr2, "id")

console.log(arr3);
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>

  1. 使用 countBy.
  2. 根据 id 获取所有项目的数量
  3. 使用 uniqBy 删除重复项。
  4. map 添加计数。

最后两个可以完成 in a chained operation 这将执行惰性评估而不是两个完整的循环。

const arr1 = [{name: "name1",id: 1},{name: "name2",id: 1},{name: "name3",id: 4},{name: "name3",id: 3},{name: "name1",id: 5}];

const counts = _.countBy(arr1, "id");

const result = _(arr1)
  .uniqBy("id")
  .map(x => ({...x, count: counts[x.id]}))
  .value();
console.log(result);
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>

id 分组,并映射组。将每个组转换为一个对象,该对象基于组中的第一个对象 + 组的长度为 count:

const arr = [{name: "name1",id: 1},{name: "name2",id: 1},{name: "name3",id: 4},{name: "name3",id: 3},{name: "name1",id: 5}];

const result = _(arr)
  .groupBy('id')
  .map(group => ({ ...group[0], count: group.length }))
  .value();
  
console.log(result);
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>