计算 JavaScript 数组中对象的出现次数

Count occurrences of objects in JavaScript array

本文关键字:对象 JavaScript 数组 计算      更新时间:2023-09-26

我有一个这样的对象数组:

arrayOfObjs = [{1:"h"}, {1:"h"}, {2:"h"}, {3:"ha"}, {4:"haa"}, {4:"haa"}, {4:"haa"}]

我想计算每个对象的出现次数,并在排序的可迭代数据结构中返回结果,如下所示:

{
  {4:"haa"}: 3,
  {1:"h"}: 2,
  {2:"h"}: 1,
  {3:"ha"}: 1
}

键甚至可以在数组中。我尝试在arrayOfObjs上使用Lodash的countBy 函数。然而,这仅仅导致了

{[object Object]:5}

我可以使用任何库/函数来完成这项工作?类似于Python的计数器的东西

更新

作为替代方案,我尝试像这样组织我的数组:

array = [[1,"h"], [1,"h"], [2,"h"], [3,"ha"], [4,"haa"], [4,"haa"], [4,"haa"]];

再次使用 Lodash 的 countBY 函数,我的结果是:

{1,h: 2, 2,h: 1, 3,ha: 1, 4,haa: 3}

这更好一点,但是我现在必须使用正则表达式来拆分对象的每个键,因为"1,h"是一个字符串。不理想的:(

理想情况下,我希望我的键是对象、数组或类似的东西。

无耻的插头:

我正在开发一个名为Pro的库.js该库有一个集合模块,可以做各种整洁的事情。可枚举类有一个 .groupBy() 方法,在这里特别有用。

var arrayOfObjs = [{1:"h"}, {1:"h"}, {2:"h"}, {3:"ha"}, {4:"haa"}, {4:"haa"}, {4:"haa"}];
var enumerable = pro.collections.asEnumerable(arrayOfObjs);
var grouped = enumerable.groupBy(function(o) {
    return JSON.stringify(o);
});
var composites = grouped.select(function(g) {
    return {
        key: g[0],
        count: g.length,
        group: g
    };
});
var output = composites.toArray();

您可以转到 Pro.js GitHub 页面并使用您的开发人员工具来测试库。运行我在页面上的答案中发布的代码片段,看看它是否为您产生了讨人喜欢的结果。

arrayOfObjs = [{1:"h"}, {1:"h"}, {2:"h"}, {3:"ha"}, {4:"haa"}, {4:"haa"}, {4:"haa"}];
var hash = {};
arrayOfObjs.forEach(function(item){
    var key = JSON.stringify(item);
    if (hash[key]) {
        hash[key]++;
    } else {
        hash[key] = 1;
    }
});
console.log(hash);
var hash2 = {};
arrayOfObjs.forEach(function(item){
    var key = JSON.stringify(item);
    if (hash2[key]) {
        hash2[key]++;
    } else {
        hash2[key] = 1;
    }
});
for (key in hash2) {
    val = hash2[key];
    console.log(key, val);
}

请注意,您可以使用hash[item]而不是hash[key],您只是不会以预期的方式看到它console.log(hash)

我使用 _.countBy、_.map 和 _.reduce 来决定执行此任务

arrayOfObjs = [{1:"h"}, {1:"h"}, {2:"h"}, {3:"ha"}, {4:"haa"}, {4:"haa"}, {4:"haa"}];
var a = _.countBy(arrayOfObjs, function (obj) {
    return _.map(obj, function (value, key) {
    return key + ' ' + value;
  });
})
b = _.reduce(a, function (result, value, key) {
    var splittedKey = key.split(' ');
  var newObj = {};
  newObj[splittedKey[0]] = splittedKey[1];
  var newKey = JSON.stringify(newObj)
  var resultObj = {};
  resultObj[newKey] = value;
  result.push(resultObj)
  return result;
}, []);
console.log(b)

https://jsfiddle.net/tkv94whe/

你可以尝试这样的事情:

var arrayOfObjs = [{1:"h"}, {1:"h"}, {2:"h"}, {3:"ha"}, {4:"haa"}, {4:"haa"}, {4:"haa"}]
var result = {};
arrayOfObjs.forEach(function(item){
  var objStr = JSON.stringify(item);
  result[objStr] = result[objStr]? ++result[objStr]: 1;
});
console.log(result);

您可以遍历数组并使用 JSON.stringify() 将对象转换为字符串,然后比较它们。然后可以使用其简单的哈希图技术。

arrayOfObjs = [{1:"h"}, {1:"h"}, {2:"h"}, {3:"ha"}, {4:"haa"}, {4:"haa"}, {4:"haa"}];
    var result={}
    for(var i=0;i<arrayOfObjs.length;i++){
        if(!result[JSON.stringify(arrayOfObjs[i])]){
        result[JSON.stringify(arrayOfObjs[i])]=1;
      } else {
        result[JSON.stringify(arrayOfObjs[i])]=result[JSON.stringify(arrayOfObjs[i])]+1;
      }
    }
    console.log(result);

https://jsfiddle.net/xv22v72v/