获取数组中没有任何重复项的对象的最有效方法
Most efficient way to grab objects without any duplicates in an array
我有 2 个 JavaScript 对象数组:
arr1=[{'id':'A'},{'id':'B'}, {'id':'C'}];
arr2=[{'id':'A'},{'id':'C'}, {'id':'D'}, {'id': 'E'}];
如何只获取没有重复的元素?
谢谢。
编辑
我不想删除重复项。我只想得到独一无二的
对象。
output = [{'id':'B'}, {'id':'D'}, {'id':'E'}]
不
output = [{'id':'A'},{'id':'B'}, {'id':'C'}, {'id':'D'}, {'id':'E'}]
对不起,如果我没说清楚
arr1=[{'id':'A'},{'id':'B'}, {'id':'C'}];
arr2=[{'id':'A'},{'id':'C'}, {'id':'D'}, {'id': 'E'}];
const out = Object.entries(arr1.concat(arr2).reduce((a, c) => {
a[c.id] = a[c.id] || 0;
a[c.id]++;
return a;
}, {})).filter(([k, v]) => v === 1).map(([k]) => ({id: k}));
console.log(out);
这个问题被问了很多,但在那种特殊情况下可以这样解决:
好吧,也许不是。这是按照您的要求检索输出的一种方法:
arr1=[{'id':'A'},{'id':'B'}, {'id':'C'}];
arr2=[{'id':'A'},{'id':'C'}, {'id':'D'}, {'id': 'E'}];
function getUniques(arr) {
let counter = arr.reduce((acc, val) =>
(acc[val.id] = (acc[val.id] || 0) + 1, acc), {});
return Object.keys(counter)
.filter(k => counter[k] === 1)
.map(k => ({id: k}));
}
console.log(getUniques([...arr1, ...arr2]));
有点乱,但很管用。首先找到只出现一次的 ID,然后过滤组合数组以仅包含唯一 ID。
arr1 = [{ id: "A" }, { id: "B" }, { id: "C" }];
arr2 = [{ id: "A" }, { id: "C" }, { id: "D" }, { id: "E" }];
function getCount(array, elem) {
return array.filter((e) => e === elem).length;
}
uniqueIds = [...arr1, ...arr2]
.map((e) => e.id)
.filter((e, i, a) => getCount(a, e) === 1);
let uniques = [...arr1, ...arr2].filter((e) => uniqueIds.includes(e.id));
console.log(uniques);
另一种方法:
arr1=[{'id':'A'},{'id':'B'}, {'id':'C'}];
arr2=[{'id':'A'},{'id':'C'}, {'id':'D'}, {'id': 'E'}];
var res = [];
var newArr = arr1.concat(arr2);
var reverseArr = newArr.slice().reverse();
newArr.forEach((el,idx)=> {
let iex = newArr.findIndex((e,i)=> e.id == el.id );
if (iex === idx && iex === newArr.length - (reverseArr.findIndex((e,i)=> e.id ==
el.id )+ 1) ){
res.push(el)
}
});
console.log(res)
我有 2 个 JavaScript 对象数组:
arr1=[{'id':'A'},{'id':'B'}, {'id':'C'}];
arr2=[{'id':'A'},{'id':'C'}, {'id':'D'}, {'id': 'E'}];
如何只获取没有重复的元素?
谢谢。
编辑
我不想删除重复项。我只想得到独一无二的 对象。
output = [{'id':'B'}, {'id':'D'}, {'id':'E'}]
不
output = [{'id':'A'},{'id':'B'}, {'id':'C'}, {'id':'D'}, {'id':'E'}]
对不起,如果我没说清楚
arr1=[{'id':'A'},{'id':'B'}, {'id':'C'}];
arr2=[{'id':'A'},{'id':'C'}, {'id':'D'}, {'id': 'E'}];
const out = Object.entries(arr1.concat(arr2).reduce((a, c) => {
a[c.id] = a[c.id] || 0;
a[c.id]++;
return a;
}, {})).filter(([k, v]) => v === 1).map(([k]) => ({id: k}));
console.log(out);
这个问题被问了很多,但在那种特殊情况下可以这样解决:
好吧,也许不是。这是按照您的要求检索输出的一种方法:
arr1=[{'id':'A'},{'id':'B'}, {'id':'C'}];
arr2=[{'id':'A'},{'id':'C'}, {'id':'D'}, {'id': 'E'}];
function getUniques(arr) {
let counter = arr.reduce((acc, val) =>
(acc[val.id] = (acc[val.id] || 0) + 1, acc), {});
return Object.keys(counter)
.filter(k => counter[k] === 1)
.map(k => ({id: k}));
}
console.log(getUniques([...arr1, ...arr2]));
有点乱,但很管用。首先找到只出现一次的 ID,然后过滤组合数组以仅包含唯一 ID。
arr1 = [{ id: "A" }, { id: "B" }, { id: "C" }];
arr2 = [{ id: "A" }, { id: "C" }, { id: "D" }, { id: "E" }];
function getCount(array, elem) {
return array.filter((e) => e === elem).length;
}
uniqueIds = [...arr1, ...arr2]
.map((e) => e.id)
.filter((e, i, a) => getCount(a, e) === 1);
let uniques = [...arr1, ...arr2].filter((e) => uniqueIds.includes(e.id));
console.log(uniques);
另一种方法:
arr1=[{'id':'A'},{'id':'B'}, {'id':'C'}];
arr2=[{'id':'A'},{'id':'C'}, {'id':'D'}, {'id': 'E'}];
var res = [];
var newArr = arr1.concat(arr2);
var reverseArr = newArr.slice().reverse();
newArr.forEach((el,idx)=> {
let iex = newArr.findIndex((e,i)=> e.id == el.id );
if (iex === idx && iex === newArr.length - (reverseArr.findIndex((e,i)=> e.id ==
el.id )+ 1) ){
res.push(el)
}
});
console.log(res)