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

IT技术 javascript arrays unique
2021-01-23 20:26:19

假设我有以下内容:

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)
6个回答

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

是有关如何执行操作的示例。

我收到一个错误: TypeError: (intermediate value).slice is not a function
2021-03-14 20:26:19
@Thomas ... 表示传播运算符。在这种情况下,它意味着创建新集并将其分布在列表中。您可以在此处找到更多相关信息:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-03-15 20:26:19
是否可以根据对象中的多个键找出唯一的对象?
2021-03-23 20:26:19
对于typescript,您必须使用包裹在 Array.from() 中的新 Set...我将在下面提供该答案。@AngJobs
2021-03-24 20:26:19
几个月前,@Russell Vea几乎逐字地给出了这个解决方案您是否检查了现有答案?但话又说回来,266+ 票表明也没有其他人检查。
2021-04-05 20:26:19

使用 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]
@AbdullahAlMamun 您可以在 .filter 中使用 map 而不是先调用 .map ,如下所示: array.filter((value, index, self) => self.map(x => x.age).indexOf(value.age) == index)
2021-03-12 20:26:19
这就是为什么你必须继续滚动
2021-03-17 20:26:19
ps: .filter 里面的 .map 可能很慢,所以要小心处理大数组
2021-03-19 20:26:19
@IvanNosov 你的代码片段非常好,尽管几行解释它如何与指向映射和过滤文档的指针一起工作将使初学者变得完美和清晰
2021-03-24 20:26:19
如果我想用它的索引获取值,那么我怎么能得到示例:我想得到 {"name": "Bob", "age":"17"},{"name": "Bob", "age ":"17"}
2021-03-27 20:26:19

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

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.

如果这是 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);
}
我们如何也可以打印出相同年龄的总人数?
2021-03-10 20:26:19
不,因为array_unique会比较整个项目,而不仅仅是这里询问的年龄。
2021-03-12 20:26:19
@NiettheDarkAbsol 你会怎么做这样的事情?jsfiddle.net/BeerusDev/asgq8n7e/28我有一个包含对象的数组,每个关键 Days 都有一个数组。
2021-03-12 20:26:19
@zhuguowei 也许,虽然稀疏数组没有什么问题 - 我还假设这age是一个相对较小的整数(肯定 <120)
2021-03-15 20:26:19
我认为flags = {}flags = []
2021-04-01 20:26:19

使用 ES6 特性,您可以执行以下操作:

const uniqueAges = [...new Set( array.map(obj => obj.age)) ];
这种方法只适用于原始类型(这里就是这种情况,因为年龄是一个数字数组),但对对象会失败。
2021-03-13 20:26:19
知道如何使它适用于具有两个键的对象吗?
2021-03-22 20:26:19
就像是 const uniqueObjects = [ ...new Set( array.map( obj => obj.age) ) ].map( age=> { return array.find(obj => obj.age === age) } )
2021-04-01 20:26:19