我有一个这样的对象数组:
var array = [
{"name": "one", "value": .33},
{"name": "one", "value": .54},
{"name": "one", "value": undefined},
{"name": "two", "value": .3},
{"name": "two", "value": undefined},
{"name": "two", "value": undefined},
{"name": "three", "value": undefined},
{"name": "three", "value": undefined},
{"name": "three", "value": undefined},
];
而且我需要能够查看是否唯一的名称(一个/两个/三个)在其“值”属性中只有一个数字。因此,在此示例中,答案为"is",因为“两个”的值属性为:.3,未定义,未定义。
我确实有一个很好的方法可以将唯一的“名称”字段放入数组中:
function Names(a) {
var temp = {};
for (var i = 0; i < a.length; i++)
temp[a[i].name] = true;
var r = [];
for (var k in temp)
r.push(k);
return r;
}
nameArray = Names(array);
但是,当我开始寻找实际做一个循环时,我开始感到困惑。只需将其写出来,我会认为是这样的:
var count = 0;
for (objects with name == i){
if (isNaN(value) == false){
count++
if(count > 1) {
return true;
}
}
}
当然,那是伪代码,甚至可能不是正确的方向。任何帮助表示赞赏,感谢您的阅读!
最佳答案
您可以使用每个唯一名称的数字来创建计数对象,然后检查是否有任何名称的计数为 1个和some
并返回true/false
var array = [{"name":"one","value":0.33},{"name":"one","value":0.54},{"name":"one"},{"name":"two","value":0.3},{"name":"two"},{"name":"two"},{"name":"three"},{"name":"three"},{"name":"three"}],
obj = {}
array.forEach(function(e) {
if(!obj[e.name]) obj[e.name] = 0;
if(typeof e.value == 'number') obj[e.name]+=1;
});
var result = Object.keys(obj).some(e => { return obj[e] == 1});
console.log(result)