从对象数组中筛选唯一值

16
如何使用 Array.filter() 返回带有 name 的唯一 id?我的情况与我研究的解决方案略有不同,因为我有一个对象数组。我找到的每个示例都包含单个值的扁平数组。

data=[
{id: 555, name: "Sales", person: "Jordan" },
{id: 555, name: "Sales", person: "Bob" },
{id: 555, name: "Sales", person: "John" },
{id: 777, name: "Accounts Payable", person: "Rhoda" },
{id: 777, name: "Accounts Payable", person: "Harry" },
{id: 888, name: "IT", person: "Joe" },
{id: 888, name: "IT", person: "Jake" },
];

var unique = data.filter(
function (x, i) {
   return data[i].id.indexOf(x.id) === i
});

提前感谢。

1个回答

47

我认为forEach()更适合实现你想要的功能:

var data=[
{id: 555, name: "Sales", person: "Jordan" },
{id: 555, name: "Sales", person: "Bob" },
{id: 555, name: "Sales", person: "John" },
{id: 777, name: "Accounts Payable", person: "Rhoda" },
{id: 777, name: "Accounts Payable", person: "Harry" },
{id: 888, name: "IT", person: "Joe" },
{id: 888, name: "IT", person: "Jake" },
];
var resArr = [];
data.forEach(function(item){
  var i = resArr.findIndex(x => x.name == item.name);
  if(i <= -1){
    resArr.push({id: item.id, name: item.name});
  }
});
console.log(resArr);

如果您真的想使用filter(),请尝试以下方法:

var data=[
{id: 555, name: "Sales", person: "Jordan" },
{id: 555, name: "Sales", person: "Bob" },
{id: 555, name: "Sales", person: "John" },
{id: 777, name: "Accounts Payable", person: "Rhoda" },
{id: 777, name: "Accounts Payable", person: "Harry" },
{id: 888, name: "IT", person: "Joe" },
{id: 888, name: "IT", person: "Jake" },
];
var resArr = [];
data.filter(function(item){
  var i = resArr.findIndex(x => x.name == item.name);
  if(i <= -1){
    resArr.push({id: item.id, name: item.name});
  }
  return null;
});
console.log(resArr);


没错,就是这样!我原本想用for循环,但我觉得filter更好。 - bob.mazzo
1
我不明白为什么SO会如此迅速地得出结论并备注重复答案。我已经进行了搜索,但没有找到最适合我情况的最佳解决方案。 - bob.mazzo
1
我认为使用forEach会更好,因为这种方法实际上并不使用filter函数,因为它在函数内部不返回任何内容。 - rablentain
13
数据 = 数据.reduce((items, item) => items.find(x => x.name === item.name) ? [...items] : [...items, item], [])该代码段是用来去除数据中重复的项。它使用了reduce函数和三元运算符。具体而言,它将初始值(即数组items)和当前项item作为参数传递给reduce函数。然后,在每个迭代步骤中,使用find函数查找有没有名称与当前项相同的项。如果已经存在,就返回原始数组(即items),否则将当前项添加到数组中。最终的结果是一个只包含唯一项的数组。 - Christopher Kiessling
1
@jinglesthula 对不起,只使用第一个三元分支中的项。 - Christopher Kiessling
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接