JS reducer:返回对象的组合数组

时间:2019-01-28 11:33:32

标签: javascript ecmascript-6

我有两个对象数组:

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 =>只需将第一个数组中所有不存在的项添加到第二个数组中,并通过“文本”键过滤即可。

是否可以通过减速器进行?还是更好的方法?

5 个答案:

答案 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 testsenter image description here

答案 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);

但它不会克隆对象。