如何计算js数组中多个对象中出现的值
How to count value occurences in several objects in js array?
我有一个具有相同属性和不同属性值的对象数组。
var arr = [{
1: ["option1", "option2"],
2: ["option2"],
3: ["option1"]
}, {
1: ["option2", "option1"],
2: ["option1"],
3: ["option1"]
}];
我想计算每个属性(在所有对象中都相同)的值出现次数,所以我需要以某种方式合并这些对象,或者可能以另一种方式进行比较。
这里的家伙帮助我通过使用嵌套循环来迭代它如何比较和计数几个对象的实例';javascript中数组中的属性值?
然而,我不确定它是否能解决问题。使用下面的代码,我仍然无法弄清楚如何将每个对象的属性值合并到一个对象中,以便属性匹配。请帮忙。
for (var i = 0; i < arr.length; i++) {
var obj = arr[i];
for (var key in obj) {
if (obj.hasOwnProperty(key)) { // skip properties inherited from prototype
var arr2 = obj[key];
for (var j = 0; j < arr2.length; j++) {
// Do something with arr2[j]
}
}
}
}
得到的结构是
{
1: {
option1: 2,
option2: 2
},
2: {
option2: 1,
option1: 1
},
3: {
option1: 2
}
}
版本1
var count = {};
for (var i = 0; i < arr.length; i++) {
var obj = arr[i];
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
var arr2 = obj[key];
for (var j = 0; j < arr2.length; j++) {
count[arr2[j]] = (count[arr2[j]] || 0) + 1;
}
}
}
}
产品:
{
option1: 5,
option2: 3
}
版本2
var count = [];
for (var i = 0; i < arr.length; i++) {
var obj = arr[i];
count[i] = {};
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
var arr2 = obj[key];
for (var j = 0; j < arr2.length; j++) {
count[i][arr2[j]] = (count[i][arr2[j]] || 0) + 1;
}
}
}
}
产品:
[
{
option1: 2,
option2: 2
},{
option2: 1,
option1: 3
}
]
版本3
var count = {};
for (var i = 0; i < arr.length; i++) {
var obj = arr[i];
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
if(!count[key]) count[key] = {};
var arr2 = obj[key];
for (var j = 0; j < arr2.length; j++) {
count[key][arr2[j]] = (count[key][arr2[j]] || 0) + 1;
}
}
}
}
产品:
{
1: {
option1: 2,
option2: 2
},
2: {
option2: 1,
option1: 1
},
3: {
option1: 2
}
}
以下是我如何做到这一点,使用下划线并以牺牲一些效率为代价,努力使其可读性更强(总是很难遵循嵌套3层深的循环):
(下划线文档可在http://underscorejs.org/)
var arr = [{
1: ["option1", "option2"],
2: ["option2"],
3: ["option1"]
}, {
1: ["option2", "option1"],
2: ["option1"],
3: ["option1"]
}];
var counts = {};
var flattened = _.map(arr, function(item, index) {
index++;
counts[index] = {};
var values = _.flatten(_.values(item));
_.each(values, function(val) {
counts[index][val] = (counts[val] || 0) + 1;
});
return counts;
});
console.log(JSON.stringify(counts));
// prints: [{"1":{"option1":1,"option2":1},"2":{"option2":1,"option1":1}},{"1":{"option1":1,"option2":1},"2":{"option2":1,"option1":1}}]
相关jsfiddle:http://jsfiddle.net/8yx6P/3/
相关文章:
- Javascript(Angular)从一个对象数组到第二个数组查找值
- 在Javascript中转换对象数组
- 在JavaScript中通过索引从对象数组中获取值
- Backbone虹吸以获取对象数组
- 如何在DataTables 2.1中迭代对象数组
- Javascript-根据赋值顺序,按键合并对象数组
- 将事件附加到对象/数组
- jQuery$.inArray()总是返回-1和一个对象数组
- javascript处理一个对象数组以获得一个新的对象数组
- javascript在数组中获取对象数组中键的所有不同值
- 在对象数组中查找多个值的d3范围
- Undercore.js获取对象数组中键对象的值
- 在mongoose中使用正则表达式在对象数组中进行查询搜索
- 如何通过json对象数组为嵌套对象赋值
- 如何循环通过2个对象数组并通过匹配id进行合并
- 为对象数组创建列表项
- 如何使用javascript合并两个对象数组
- JSON到对象数组,并向每个对象添加项
- JavaScript:从对象数组中获取唯一值及其计数
- 按不同项目对对象数组进行排序