数组中不同属性值对象的 Javascript 编号

Javascript number of object by different property values in array

本文关键字:对象 Javascript 编号 属性 数组      更新时间:2023-09-26

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

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

您可以使用 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)

带有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是你的答案。

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'));

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

到目前为止,其他答案显示了一些有趣的方法。我会注意浏览器兼容性;例如,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'} ] );

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

lodash 非常适合这样的事情。

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

它会返回2.