提问者:小点点

如何在JavaScript中从对象数组中获取不同的值?


假设我有以下内容:

var array = 
    [
        {"name":"Joe", "age":17}, 
        {"name":"Bob", "age":17}, 
        {"name":"Carl", "age": 35}
    ]

获得所有不同年龄数组的最佳方法是什么,这样我就获得了如下结果数组:

[17, 35]

是否有某种方法可以替代地构造数据或更好的方法,使我不必遍历每个数组检查“age”的值,并检查另一个数组是否存在,如果不存在则添加它?

如果有什么方法我可以把不同的年代拉出来而不用迭代。。。

我想改进目前的无效方法。。。如果这意味着“数组”不是一个对象数组,而是一个带有唯一键(即“1,2,3”)的对象的“映射”,那也没问题。我只是在寻找最有效的方式。

下面是我目前的做法,但对我来说,迭代似乎只是效率很差,即使它确实有效。。。

var distinct = []
for (var i = 0; i < array.length; i++)
   if (array[i].age not in distinct)
      distinct.push(array[i].age)

共3个答案

匿名用户

如果这是PHP,我将用键构建一个数组,并在末尾使用array_keys,但JS没有这样的奢侈。相反,请尝试以下方法:

var flags = [], output = [], l = array.length, i;
for( i=0; i<l; i++) {
    if( flags[array[i].age]) continue;
    flags[array[i].age] = true;
    output.push(array[i].age);
}

匿名用户

如果您使用的是ES6/ES2015或更高版本,您可以这样做:

const data = [
  { group: 'A', name: 'SD' }, 
  { group: 'B', name: 'FI' }, 
  { group: 'A', name: 'MM' },
  { group: 'B', name: 'CO'}
];
const unique = [...new Set(data.map(item => item.group))]; // [ 'A', 'B']

这里有一个关于如何做的例子。

匿名用户

使用ES6

let array = [
  { "name": "Joe", "age": 17 },
  { "name": "Bob", "age": 17 },
  { "name": "Carl", "age": 35 }
];
array.map(item => item.age)
  .filter((value, index, self) => self.indexOf(value) === index)

> [17, 35]