计算 JavaScript 数组中对象的出现次数
Count occurrences of objects in JavaScript array
我有一个这样的对象数组:
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/
相关文章:
- 面向对象JavaScript中的私有函数
- 对象 Javascript 中的标签无效 - 想要添加事件列表器
- 将字符串转换为对象 javascript/jquery
- 正在检查对象javascript中是否存在嵌套属性
- 时间-日期对象JavaScript getUTCMilliseconds
- 仅在对象(javascript)中解析值
- 使用对象(JavaScript或jQuery)填充选择下拉列表
- 引用另一个对象javascript中的对象
- 如何删除列表中的对象?Javascript nodejs和下划线
- 无法从日期对象javascript获取日期和月份
- 如何在if语句中使用对象-Javascript
- 对象javascript错误
- 对象Javascript的少数实例
- 位置对象Javascript
- 将字符串传递到对象javascript中
- 获取对象Javascript或jQuery的最后一个值
- 鼠标接近对象Javascript
- 这个mixins代码是书中的错误吗;面向对象JavaScript的原理”;
- 使用闭包编译器编写更好的面向对象JavaScript完整示例代码
- 访问对象javascript数组中的对象属性值