我是JavaScript编程的新手,我有两个具有以下结构的对象数组:
myFirstObjArray = [{foo: 1, bar: 1}, {foo: 3, bar: 3}, {foo: 4, bar: 5}];
mySecondObjArray = [{foo: 2}, {foo: 4}, {foo: 5}];
我需要获得两个包含key foo
值的独立数组,第一个包含第一个数组但不包含第二个数组的数组,基于key foo
的值,以及mySecondObjArray
中的第二个但不在myFirstObjArray
中。
如果没有
,有没有办法做到这一点for(i=0;i<myFirstObjArray.length;i++)
for(j=0;j<mySecondObjArray .length;j++)
{...build first array here}
for(i=0;i<mySecondObjArray .length;i++)
for(j=0;j<myFirstObjArray.length;j++)
{...build second array here}
?也许我的问题是一个我没有找到的重复问题,所以请保持温和。
预期产出:
firstArray = [{foo: 1}, {foo: 3}];
secondArray = [{foo: 2}, {foo: 5}];
答案 0 :(得分:13)
您可以通过基于其他数组元素设置条件来简单地过滤一个数组的元素。
var myFirstObjArray = [{foo: 1, bar: 1}, {foo: 3, bar: 3}, {foo: 4, bar: 5}],
mySecondObjArray = [{foo: 2}, {foo: 4}, {foo: 5}],
firstArray = myFirstObjArray.filter(o=> !mySecondObjArray.some(i=> i.foo === o.foo));
secondArray = mySecondObjArray.filter(o=> !myFirstObjArray.some(i=> i.foo === o.foo));
console.log(firstArray.map(o=> {return {'foo' : o.foo}}))
console.log(secondArray.map(o=> {return {'foo' : o.foo}}))
Ps:
some()
方法测试数组中是否至少有一个元素通过了由提供的函数实现的测试。我添加了一个函数,只检查另一个数组中是否存在具有相同值的foo
属性,以便能够从第一个数组中进行过滤。
最后,您可以使用.map
过滤掉所需的键值对
希望有意义
答案 1 :(得分:9)
这是一个只有filter
和map
foo
属性的小解决方案。
const myFirstObjArray = [{foo: 1, bar: 1}, {foo: 3, bar: 3}, {foo: 4, bar: 5}];
const mySecondObjArray = [{foo: 2}, {foo: 4}, {foo: 5}];
const exclude = (arr1, arr2) => arr1.filter(o1 => arr2.map(o2 => o2.foo).indexOf(o1.foo) === -1);
console.log(exclude(myFirstObjArray, mySecondObjArray));
console.log(exclude(mySecondObjArray, myFirstObjArray));
答案 2 :(得分:1)
您可以通过查找进行过滤。
const unique = a => o => !a.some(({ foo }) => o.foo === foo);
var first = [{foo: 1, bar: 1}, {foo: 3, bar: 3}, {foo: 4, bar: 5}],
second = [{foo: 2}, {foo: 4}, {foo: 5}],
uniqueFirst = first.filter(unique(second)),
uniqueSecond = second.filter(unique(first));
console.log(uniqueFirst);
console.log(uniqueSecond);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
答案 3 :(得分:1)
您可以创建可重复使用的功能以防止代码重复。只需切换到功能参数即可。另请注意,内部循环是简单的for
循环,因此我们可以使用break
并避免不必要的检查。
var firstArray = [];
var secondArray = [];
var myFirstObjArray = [{foo: 1, bar: 1}, {foo: 3, bar: 3}, {foo: 4, bar: 5}];
var mySecondObjArray = [{foo: 2}, {foo: 4}, {foo: 5}];
function difference(myFirstObjArray, mySecondObjArray){
var firstArray = [];
myFirstObjArray.forEach((obj)=>{
var match = false;
for(var i=0; i<mySecondObjArray.length; i++){
var secondObj = mySecondObjArray[i];
if(obj.foo === secondObj.foo){
match = true;
break;
}
}
if(!match){
firstArray.push({'foo': obj.foo});
}
});
return firstArray;
}
console.log(difference(myFirstObjArray, mySecondObjArray));
console.log(difference(mySecondObjArray, myFirstObjArray));
&#13;
答案 4 :(得分:1)
ES5,不使用胖箭头,
var myFirstObjArray = [{foo: 1, bar: 1}, {foo: 3, bar: 3}, {foo: 4, bar: 5}],
mySecondObjArray = [{foo: 2}, {foo: 4}, {foo: 5}],
firstArray = myFirstObjArray.filter(function(o) { return !mySecondObjArray.some(function(i) { return i.foo === o.foo})});
secondArray = mySecondObjArray.filter(function(o) { return !myFirstObjArray.some(function(i) { return i.foo === o.foo})});
console.log(firstArray)
console.log(secondArray)
&#13;