网站搜索

typescript - JavaScript:从对象数组中移除重复项


我有一个看起来像这样的数据数组。

data = [ 
  { "name": "Apple", "type": "Fruit"}, 
  { "name": "Cabbage", "type": "Vegetable"} , 
  { "name": "Orange", "type": "Fruit"} 
] 

我想过滤掉 type 已经存在的元素。我想保留第一个元素。

例如,保留苹果而不是橙子

data = [ 
  { "name": "Apple", "type": "Fruit"},
  { "name": "Cabbage", "type": "Vegetable"}
]

答案#1

使用 Array#filter,您可以在遍历数组的同时更新 Set 来跟踪已添加的类型:

const data = [ { "name": "Apple", "type": "Fruit"}, { "name": "Cabbage", "type": "Vegetable"}, { "name": "Orange", "type": "Fruit"} ];

const typeSet = new Set();
const res = data.filter(({ type }) => {
  if(typeSet.has(type)) return false;
  typeSet.add(type);
  return true;
});

console.log(res);

答案#2

1) 如果 type 尚未出现在 dict 中,你可以使用 filter 和 Set 过滤结果,如下所示:

data.filter((o) => (dict.has(o.type) ? false : dict.add(o.type, true)))

const data = [
  { name: "Apple", type: "Fruit" },
  { name: "Cabbage", type: "Vegetable" },
  { name: "Orange", type: "Fruit" },
];

const dict = new Set();
const result = data.filter((o) => (dict.has(o.type) ? false : dict.add(o.type, true)));
console.log(result)

2) 你也可以使用 for..of 和 Set,如下所示:

const data = [
  { name: "Apple", type: "Fruit" },
  { name: "Cabbage", type: "Vegetable" },
  { name: "Orange", type: "Fruit" },
];

const dict = new Set(), result = [];

for (let o of data) {
  if (!dict.has(o.type)) {
    result.push(o);
    dict.add(o.type);
  }
}

console.log(result);