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

2022-08-29 22:32:11

假设我有以下几点:

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)

答案 1

如果您使用的是 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']

下面是一个关于如何做到这一点的示例。


答案 2

对于那些想要返回具有所有属性的唯一键的对象

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

const key = 'age';

const arrayUniqueByKey = [...new Map(array.map(item =>
  [item[key], item])).values()];

console.log(arrayUniqueByKey);

   /*OUTPUT
       [
        { "name": "Bob", "age": 17 },
        { "name": "Carl", "age": 35 }
       ]
   */

 // Note: this will pick the last duplicated item in the list.