Javascript数量的对象由数组中的不同属性值

时间:2015-07-02 06:02:25

标签: javascript

计算具有不同对象属性p值的数组中对象数量的最佳方法。

function([{"p":"a"},{"p":"b"},{"p":"a"}]){
    // some code
}
// in this case return 2

5 个答案:

答案 0 :(得分:1)

您可以使用 Array.prototype.filter() 来保留所需的值。在这种情况下,您必须创建一个变量temp来存储重复值,如果它不存在,也必须在filter function返回true内。因此,您有一个新的唯一值数组。

var arr = [{"p":"a"},{"p":"b"},{"p":"a"}], temp = [];

var arrUniques = arr.filter(function(obj){
  return temp.indexOf(obj.p) === -1 ? !!temp.push(obj.p) : false
});

alert(arrUniques.length)

答案 1 :(得分:0)

使用Map

var props = new Map();
for (var i = 0; i < array.length; i++) {
    var prop = array[i].p,
        count = props.get(prop) || 0;

    props.set(prop, count + 1);
}

var size = props.size;

如果您的属性可以安全地转换为字符串,则可以使用公共对象:

var props = {};
...
var size = Object.keys(props).length;

否则,Map就是您的答案。

答案 2 :(得分:0)

lodash很适合这样的事情。

使用

_.uniq([{"p":"a"},{"p":"b"},{"p":"a"}]).length

并且它会返回2

答案 3 :(得分:0)

function getUniquePropertyCount(a, p) {
    return a.reduce(function (res, el) {
        !~res.indexOf(el[p]) && res.push(el[p]);
        return res;
    }, []).length;
}
document.write(getUniquePropertyCount([{ "p": "a" }, { "p": "b" }, { "p": "a" }], 'p'));

答案 4 :(得分:0)

我想这是其中一个问题,如果你问四个程序员,你会得到五个答案。

到目前为止,其他答案显示了一些有趣的方法。我会注意浏览器的兼容性;例如,Map()仅适用于最新的浏览器,而不适用于IE 10或之前的版本。

所以这是另一个解决方案。它的代码更多一些,但它很容易理解,并且适用于所有浏览器:

function countUniqueProperties( key, array ) {
    var count = 0, values = {};
    for( var i = 0;  i < array.length;  ++i ) {
        var value = array[i][key];
        if( ! Object.prototype.hasOwnProperty.call( values, value) ) {
            ++count;
            values[value] = true;
        }
    }
    return count;
}

countUniqueProperties( 'p', [ {p:'a'}, {p:'b'}, {p:'a'} ] );

这里一个复杂的部分是Object.prototype.hasOwnProperty.call(values,value)。您可以使用values.hasOwnProperty(value),但如果您的某个属性值为字符串"hasOwnProperty",则会失败:

countUniqueProperties( 'p', [ {p:'a'}, {p:'hasOwnProperty'}, {p:'a'} ] );

使用较长的形式可以避免此问题。