从两个数组中找到不同的值

时间:2019-05-06 08:14:11

标签: javascript

我有2个数组,其中可能包含对象数组或仅数组值。

就像下面一样。

数组值结构。

enums.php

a = [{value : 'xyz' , label : 'xyz'} , {value : 'pqr' , label :'pqr'} ]

a = ["abc" , "pqr"]

另一种数组结构将与第一个相同。

如何从两个数组中获取不同的值。

a = ["xyz"]
  

注意:我不能使用任何库。

任何帮助都会很棒。

谢谢。

3 个答案:

答案 0 :(得分:1)

如果对象或值的结构相同,则可以采用Set和字符串化的值(由于对象的不同),并为相同的字符串化值过滤数组。

function getDifference(a, b) {
    var setB = new Set(b.map(o => JSON.stringify(o)));
    return a.filter(o => !setB.has(JSON.stringify(o)));
}

console.log(getDifference(["abc" , "pqr"], ["pqr"]));
console.log(getDifference(
   [{ value: 'xyz', label: 'xyz' }, { value: 'pqr', label: 'pqr' } , { value: 'abc', label:'abc' }],
   [{ value: 'xyz', label: 'xyz' }, { value: 'pqr', label: 'pqr' }]
));

要获得对称的差异,您需要使用切换数组再次调用该函数。

function getSymDifference(a, b) {
    return getDifference(a, b).concat(getDifference(b, a));
}

function getDifference(a, b) {
    var setB = new Set(b.map(o => JSON.stringify(o)));
    return a.filter(o => !setB.has(JSON.stringify(o)));
}

console.log(getSymDifference(["abc" , "pqr"], ["pqr", "xyz"]));
console.log(getSymDifference(
   [{ value: 'xyz', label: 'xyz' }, { value: 'pqr', label: 'pqr' } , { value: 'abc', label:'abc' }],
   [{ value: 'xyz', label: 'xyz' }, { value: 'pqr', label: 'pqr' }, { value: '111', label: '222' }]
));

答案 1 :(得分:0)

使用filter

const array1 = [{value : 'xyz' , label : 'xyz'} , {value : 'pqr' , label :'pqr'}  , {value : 'abc' , label :'abc'}];
const array2 = [{value : 'xyz' , label : 'xyz'} , {value : 'pqr' , label :'pqr'}];
const res = array1.filter(e => array2.find(f => JSON.stringify(f) != JSON.stringify(e)));
console.log(res);
.as-console-wrapper { max-height: 100% !important; top: auto; }

答案 2 :(得分:0)

您可以创建所有唯一值的Set。您可以检查该项目是否为object。如果是,则获取label属性,否则使用项目本身:

function getMerged(array1, array2) {
  // get unique values from both array
  const set = new Set(array1.map(a => typeof a === 'object' ? a.label : a));
  array2.forEach(a => set.add(typeof a === 'object' ? a.label : a));
  
  // create an array of objects from the unique values
  return [...set].map(value => ({ label: value, value }))
}

console.log(getMerged(["abc" , "pqr"], [{value : 'xyz' , label : 'xyz'} , {value : 'pqr' , label :'pqr'} ]))