如何计算js数组中多个对象中出现的值

How to count value occurences in several objects in js array?

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

我有一个具有相同属性和不同属性值的对象数组。

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/