如何通过唯一 ID 和唯一名称过滤对象数组?
How to filter an array of objects by unique ID and unique name?
我有一个对象数组,如下所示:
[
{
id: 1234
name: Name1
},
{
id: 5678
name: Name1
},
{
id: 1234
name: Name1
},
{
id: 5678
name: Name2
},
]
我想过滤并删除具有相同 ID 和相同名称的对象,因此预期结果如下所示:
[
{
id: 1234
name: Name1
},
{
id: 5678
name: Name1
},
{
id: 5678
name: Name2
},
]
但是我只能通过唯一 ID 过滤对象数组,我不确定如何满足同名的额外条件:
data.filter((value, index, self) => {
return (
self.findIndex((v) => v.id=== value.id) === index
);
});
您可以简单地使用 &&
来包含需要满足的其他条件:在您的示例中,您需要 id
和 name
匹配:
const filteredData = data.filter((value, index, self) =>
self.findIndex(v => v.id === value.id && v.name === value.name) === index
);
如果你有多个key要考虑,又不想写多个&&
语句,可以简单的把key存放在一个数组中,然后用Array.prototype.every()
强制执行比赛:
const keys = ['id', 'name'];
const filteredData = data.filter((value, index, self) =>
self.findIndex(v => keys.every(k => v[k] === value[k])) === index
);
见下文proof-of-concept:
const data = [{
id: 1234,
name: 'Name1'
},
{
id: 5678,
name: 'Name1'
},
{
id: 1234,
name: 'Name1'
},
{
id: 5678,
name: 'Name2'
},
];
const keys = ['id', 'name'];
const filteredData = data.filter((value, index, self) =>
self.findIndex(v => keys.every(k => v[k] === value[k])) === index
);
console.log(filteredData);
您可以在 findIndex
中扩展和添加另一个条件。像这样
data.filter((value, index, self) => {
return (
self.findIndex((v) => v.id === value.id && v.name === value.name) === index
);
});
但这很耗时。如果你创建一个散列并使用它来过滤掉,你会更好。
data.reduce( (acc, current) => {
acc[`${current.name}#${current.id}`] = current;
return acc
}, {}).values()
我在这里所做的是为 name
/id
的每个唯一组合创建一个条目,然后只获取该对象的值。
您可以使用 array.filter() method along with array.indexOf() and array.lastIndexOf()
来尝试这个直接的解决方案
工作演示:
const obj = [
{
id: 1234,
name: 'Name1'
},
{
id: 5678,
name: 'Name1'
},
{
id: 1234,
name: 'Name1'
},
{
id: 5678,
name: 'Name2'
}
];
const res = obj.filter((item, index, obj) =>
obj.indexOf(item) && obj.lastIndexOf(item)
);
console.log(res);
使用Array.reduce
迭代并return通过删除基于相同id
和name
属性的重复项得到最终数组;要检查重复的对象值,您可以使用 Set
来跟踪唯一值。
const objList = [
{
id: 1234,
name: "Name1"
},
{
id: 5678,
name: "Name1"
},
{
id: 1234,
name: "Name1"
},
{
id: 5678,
name: "Name2"
},
];
const removeDuplicate = (arr) => {
const set = new Set();
return arr.reduce((finalList, {id, name}) => {
const key = `${id}${name}`;
if (!set.has(key)) {
finalList.push({
id,
name
})
}
set.add(key);
return finalList;
}, []);
}
console.log(removeDuplicate(objList));
我有一个对象数组,如下所示:
[
{
id: 1234
name: Name1
},
{
id: 5678
name: Name1
},
{
id: 1234
name: Name1
},
{
id: 5678
name: Name2
},
]
我想过滤并删除具有相同 ID 和相同名称的对象,因此预期结果如下所示:
[
{
id: 1234
name: Name1
},
{
id: 5678
name: Name1
},
{
id: 5678
name: Name2
},
]
但是我只能通过唯一 ID 过滤对象数组,我不确定如何满足同名的额外条件:
data.filter((value, index, self) => {
return (
self.findIndex((v) => v.id=== value.id) === index
);
});
您可以简单地使用 &&
来包含需要满足的其他条件:在您的示例中,您需要 id
和 name
匹配:
const filteredData = data.filter((value, index, self) =>
self.findIndex(v => v.id === value.id && v.name === value.name) === index
);
如果你有多个key要考虑,又不想写多个&&
语句,可以简单的把key存放在一个数组中,然后用Array.prototype.every()
强制执行比赛:
const keys = ['id', 'name'];
const filteredData = data.filter((value, index, self) =>
self.findIndex(v => keys.every(k => v[k] === value[k])) === index
);
见下文proof-of-concept:
const data = [{
id: 1234,
name: 'Name1'
},
{
id: 5678,
name: 'Name1'
},
{
id: 1234,
name: 'Name1'
},
{
id: 5678,
name: 'Name2'
},
];
const keys = ['id', 'name'];
const filteredData = data.filter((value, index, self) =>
self.findIndex(v => keys.every(k => v[k] === value[k])) === index
);
console.log(filteredData);
您可以在 findIndex
中扩展和添加另一个条件。像这样
data.filter((value, index, self) => {
return (
self.findIndex((v) => v.id === value.id && v.name === value.name) === index
);
});
但这很耗时。如果你创建一个散列并使用它来过滤掉,你会更好。
data.reduce( (acc, current) => {
acc[`${current.name}#${current.id}`] = current;
return acc
}, {}).values()
我在这里所做的是为 name
/id
的每个唯一组合创建一个条目,然后只获取该对象的值。
您可以使用 array.filter() method along with array.indexOf() and array.lastIndexOf()
来尝试这个直接的解决方案工作演示:
const obj = [
{
id: 1234,
name: 'Name1'
},
{
id: 5678,
name: 'Name1'
},
{
id: 1234,
name: 'Name1'
},
{
id: 5678,
name: 'Name2'
}
];
const res = obj.filter((item, index, obj) =>
obj.indexOf(item) && obj.lastIndexOf(item)
);
console.log(res);
使用Array.reduce
迭代并return通过删除基于相同id
和name
属性的重复项得到最终数组;要检查重复的对象值,您可以使用 Set
来跟踪唯一值。
const objList = [
{
id: 1234,
name: "Name1"
},
{
id: 5678,
name: "Name1"
},
{
id: 1234,
name: "Name1"
},
{
id: 5678,
name: "Name2"
},
];
const removeDuplicate = (arr) => {
const set = new Set();
return arr.reduce((finalList, {id, name}) => {
const key = `${id}${name}`;
if (!set.has(key)) {
finalList.push({
id,
name
})
}
set.add(key);
return finalList;
}, []);
}
console.log(removeDuplicate(objList));