首页 > 解决方案 > Javascript对象数组-按特定键的唯一性过滤,并仅保留某些键

问题描述

我确信这个问题之前已经以某种形式在这里提出过,但我很难找到正确的解决方案。我有一个这样的对象数组:

[
  {id:"124", name:"Joe", lname:"Smith", age:"14"},
  {id:"124", name:"Joe", lname:"Smith", age:"17"},
  {id:"124", name:"Joe", lname:"Smith", age:"21"},
  {id:"128", name:"Tom", lname:"Cans", age:"18"},
  {id:"132", name:"Mik", lname:"Brak", age:"21"}
];

我想缩短这个数组,使它只包含具有唯一id键的对象,以及只有键id、name、lname。我要的输出是:

 [
   {id:"124", name:"Joe", lname:"Smith"},
   {id:"128", name:"Tom", lname:"Cans"},
   {id:"132", name:"Mik", lname:"Brak"}
 ];

到目前为止我所做的 - 我可以使用以下代码片段来创建一组唯一 ID,但这并没有让我到达我需要去的地方:

 let uniqueIDs = [... new Set(mydata.map(val => val.id))];

任何帮助表示赞赏!

标签: javascript

解决方案


将您的数组项存储在一个由 索引的对象中id,并跳过您已经拥有的任何内容:

var obj = {}
[ {id:"124", name:"Joe", lname:"Smith", age:"14"},
  {id:"124", name:"Joe", lname:"Smith", age:"17"},
  {id:"124", name:"Joe", lname:"Smith", age:"21"},
  {id:"128", name:"Tom", lname:"Cans", age:"18"},
  {id:"132", name:"Mik", lname:"Brak", age:"21"}
].forEach(function(d){
  if ( ! obj[d.id] ) {
    // omit the info you're not interested in
    obj[d.id] = { id: d.id, name: d.name, lname: d.lname } 
  }
})
var uniq = Object.values(obj);
console.log(uniq)


推荐阅读