计算具有不同对象属性p值的数组中对象数量的最佳方法。
function([{"p":"a"},{"p":"b"},{"p":"a"}]){
// some code
}
// in this case return 2
答案 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)
答案 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'} ] );
使用较长的形式可以避免此问题。