我有两个对象数组:
const first = [{text: 'sometext1', applicable: true}, {text: 'sometext2', applicable: false}, {text: 'sometext3', applicable: true}];
const second = [{text: 'sometext1', applicable: true}, {text: 'sometext2', applicable: true}];
结果,我想获得这样的数组:
const result = [{text: 'sometext1', applicable: true}, {text: 'sometext2', applicable: true}, {text: 'sometext3', applicable: true}];
so =>只需将第一个数组中所有不存在的项添加到第二个数组中,并通过“文本”键过滤即可。
是否可以通过减速器进行?还是更好的方法?
答案 0 :(得分:1)
只需遍历第一个数组并检查每个项目是否存在于第二个数组中,如果不存在,则推入第二个数组。
first.forEach((item) => {
const index = second.findIndex((st) => st.text === item.text);
if(index < 0) {
second.push(item);
}
})
答案 1 :(得分:0)
您可以使用地图
const first = [{text: 'sometext1', applicable: true}, {text: 'sometext2', applicable: false}, {text: 'sometext3', applicable: true}];
const second = [{text: 'sometext1', applicable: true}, {text: 'sometext2', applicable: true}];
var a=second.map((e)=>e.text);
first.map((e)=>{a.includes(e.text)?false:second.push(e)})
console.log(second);
答案 2 :(得分:0)
您可以使用过滤器通过密钥删除重复项。
function concatAndRemoveDuplicates(arr1, arr2) {
return arr1.concat(
arr2.filter((o) => !arr2.map((x) => x.text).includes(o.text)),
);
}
答案 3 :(得分:0)
根据您的标签,我发现您可以使用ES6,因此可以使用Set进行操作,例如在数组中具有唯一值,然后对其进行过滤:
const grouped = [...second, ...first];
const result =
[ ...new Set(grouped.map(({ text}) => text))]
.map(text => grouped.find(obj => obj.text === text))
这是一个link with tests:
答案 4 :(得分:0)
你可以做
const first = [{text: 'sometext1', applicable: true}, {text: 'sometext2', applicable: false}, {text: 'sometext3', applicable: true}];
const second = [{text: 'sometext1', applicable: true}, {text: 'sometext2', applicable: true}];
const results = [...second, ...first.filter(({text:firstText})=>!second.find(({text})=>text===firstText))]
console.log(results);
但它不会克隆对象。