如何获取包含数据相同的对象数组中数据计数的信息

3
假设我有一个对象数组 arr1arr1 = [{name: "name1",id: 1},{name: "name2",id: 1},{name: "name3",id: 4},{name: "name3",id: 3},{name: "name1",id: 5}] 我想要以数组或对象形式获取具有相同id的计数信息。
我尝试使用for循环,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(arr1, "id")?为什么不使用已经存在的功能呢? - VLAZ
我可以使用。实际上,我已经习惯了在Lodash中使用。 - Rrptm
2个回答

3

按照 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>


0
使用 countBy 按照它们的 id 获取所有项目的计数。 使用 uniqBy 删除重复项。 使用 map 添加计数。 最后两个可以在 链接操作 中完成,这将进行惰性评估而不是两个完整循环。

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>


这段代码在片段中运行良好,但在实际代码中没有起作用。它返回了LodashWrapper。 - Rrptm
您可以通过在末尾添加 .value() 来明确地解包该值。虽然通常不需要这样做,但为了以防万一,我在答案中添加了它。 - VLAZ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接