2 回答
TA贡献1798条经验 获得超3个赞
const array1 = [
{
props: {
type : 'text',
id : 'item1',
name : 'item1',
value : '@item1@',
},
},
{
props: {
type: 'hidden',
id: 'item2',
name: 'item2',
value: '@item2@',
},
}
];
const array2 = [
{
props: {
type: 'hidden',
id: 'item1',
name: 'item1',
value: '@item1@',
},
}
];
function getUnique(arr, comp) {
const unique = arr
.map(e => e[comp])
// store the keys of the unique objects
.map((e, i, final) => final.indexOf(e) === i && i)
// eliminate the dead keys & store unique objects
.filter(e => arr[e]).map(e => arr[e]);
return unique;
}
const arr = array1.concat(array2);
console.log(getUnique(arr, 'id'));
TA贡献1859条经验 获得超6个赞
你可以
id => object
从第一个数组创建一个 Map遍历第二个数组,或者
如果尚未在地图中添加该项目
检查当前项目是否不是
type: "hidden"
并覆盖另一个否则丢弃该项目
从 Map 创建一个新数组
const array1 = [
{
props: {
type : 'text',
id : 'item1',
name : 'item1',
value : '@item1@',
},
},
{
props: {
type: 'hidden',
id: 'item2',
name: 'item2',
value: '@item2@',
},
},
{
props: {
type: 'hidden',
id: 'item3',
name: 'item3',
value: '@item3@',
},
}
];
const array2 = [
{
props: {
type: 'hidden',
id: 'item1',
name: 'item1',
value: '@item1@',
},
},
{
props: {
type: 'text',
id: 'item3',
name: 'item3',
value: '@item3@',
},
}
];
//1. create a map from id => object pairs
const map = new Map(array1.map(obj => [obj.props.id, obj]));
//2. go over the second array
array2.forEach(obj => {
if (!map.has(obj.props.id) //not a duplicate
|| obj.props.type !== "hidden") { //is not hidden
//insert
map.set(obj.props.id, obj);
}
});
//3. convert back into array
const merged = [...map.values()];
console.log(merged);
为了记录,您基本上可以使用相同(或非常相似)的东西,.filter
但您必须O(n)
对每个项目进行查找。Map 确保更快的查找。
添加回答
举报