删除了重复的对象并将其数组元素与其他Javascript合并



我开发了许多复杂的项目。但是,我总是被困在简单的事情上。任何人都可以指导或分享一些文档来培训这些常见的逻辑问题。我有一个对象数组,这些对象可以重复。

每个对象都有一个数组属性权限:['add', 'remove']。我想删除可重复的对象并获取其权限数组属性并将其与我们找到的对象合并。权限数组应具有唯一值。

请指导我指向一些网站或书籍,这将有助于我解决逻辑问题

const arr = [
{ id: 1, permission: ['add', 'remove'] },
{ id: 2,  permission: ['add', 'upload']},
{ id: 2, permission: ['add', 'remove', 'edit'] },
{ id: 3, permission: ['add', 'remove'] },
{ id: 4, permission: ['add', 'remove'] },
{ id: 5, permission: ['add', 'read'] },
{ id: 5, permission: ['read', 'remove'] },
{ id: 6, permission: ['add', 'remove'] },
];
// Result I am looking for.
[
{ id: 1,  permission: ['add', 'remove'] },
{ id: 2,  permission: ['add', 'remove', 'edit', 'upload'] },
{ id: 3,  permission: ['add', 'remove'] },
{ id: 4,  permission: ['add', 'remove'] },
{ id: 5,  permission: ['add','read', 'remove'] },
{ id: 6,  permission: ['add', 'remove'] },
];
// Tried so far 
const seen = new Set();
const fa = arr.filter((el) => {
const duplicate = seen.has(el.id);
seen.add(el.id);
return !duplicate;
});

使用array.reduce 创建ids 的哈希,然后使用Object.values()访问它的值,

请在随附的代码片段中找到代码

const arr = [
{ id: 1, permission: ['add', 'remove'] },
{ id: 2,  permission: ['add', 'upload']},
{ id: 2, permission: ['add', 'remove', 'edit'] },
{ id: 3, permission: ['add', 'remove'] },
{ id: 4, permission: ['add', 'remove'] },
{ id: 5, permission: ['add', 'read'] },
{ id: 5, permission: ['read', 'remove'] },
{ id: 6, permission: ['add', 'remove'] },
];
const result = arr.reduce((acc, {id, permission}) => {
if (!acc[id]) {
acc[id] = {
id,
permission: [...new Set(permission)],
};
}
acc[id] = { 
id,
permission: [...new Set([...acc[id].permission, ...permission])],
};
return acc;
}, {});
console.log(Object.values(result));

const arr = [
{ id: 1, permission: ['add', 'remove'] },
{ id: 2,  permission: ['add', 'upload']},
{ id: 2, permission: ['add', 'remove', 'edit'] },
{ id: 3, permission: ['add', 'remove'] },
{ id: 4, permission: ['add', 'remove'] },
{ id: 5, permission: ['add', 'read'] },
{ id: 5, permission: ['read', 'remove'] },
{ id: 6, permission: ['add', 'remove'] },
];

function run(arr) {
return arr.reduce((previousValue ,currentValue) => {
let item = previousValue.find(e => e.id === currentValue.id)
if (item) {
item.permission =  [...new Set([...item.permission, ...currentValue.permission])]
return previousValue
} else {
return previousValue.concat(currentValue)
}
},[])
}
console.log(run(arr))

这将起作用!!

var arr = [
{ id: 1, permission: ['add', 'remove'] },
{ id: 2,  permission: ['add', 'upload']},
{ id: 2, permission: ['add', 'remove', 'edit'] },
{ id: 3, permission: ['add', 'remove'] },
{ id: 4, permission: ['add', 'remove'] },
{ id: 5, permission: ['add', 'read'] },
{ id: 5, permission: ['read', 'remove'] },
{ id: 6, permission: ['add', 'remove'] },
];
var res = [];
for (var i = 0; i< arr.length; i++) {
if(res.length == 0) res.push(arr[i]);
else {
if ( !res.find(item => item.id == arr[i]['id'])) {
res.push(arr[i]);
}
else  {
var resIndex = res.findIndex(item => item.id == arr[i]['id']);
for(var j=0; j<arr[i]['permission'].length; j++) {
if(res[resIndex]['permission'].indexOf(arr[i]['permission'][j]) === -1) res[resIndex]['permission'].push(arr[i]['permission'][j]);
}
}
}
}
console.log(res);

const arr = [
{ id: 1, permission: ['add', 'remove'] },
{ id: 2, permission: ['add', 'upload'] },
{ id: 2, permission: ['add', 'remove', 'edit'] },
{ id: 3, permission: ['add', 'remove'] },
{ id: 4, permission: ['add', 'remove'] },
{ id: 5, permission: ['add', 'read'] },
{ id: 5, permission: ['read', 'remove'] },
{ id: 6, permission: ['add', 'remove'] }
];

let i;
arr.forEach(function (arrkey, index) {
for (i = index + 1; i < arr.length; ++i) {
if (arrkey.id === arr[i].id) {
arr[i].permission.forEach(function (per) {
if (!arrkey.permission.includes(per)) {
arrkey.permission.push(per);
}     
});
arr.splice(i, 1);
}
}
});

console.log(arr);

这个简单的解决方案应该有效。

最新更新