我有一个这样的对象数组:

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)

07-25 21:39
查看更多