对象数组交集

时间:2016-04-27 16:04:56

标签: javascript

我有两个对象列表,我想在没有array1中的file密钥的情况下过滤我的array2

我做了什么:

array1 = array1.filter(function(n) {
    for(var i=0; i < array2.length; i++){
      if(n.file != array2[i].file){
        return n;
      }
    }
});

这将完全返回array1,而如果我将!=替换为==,则返回我想要删除的对象。

我不明白为什么。

https://jsfiddle.net/hrzzohnL/1/

所以最后我想以这个数组结束:

[
    {
     "file": "tttt.csv",
     "media": "tttt"
    }
]

4 个答案:

答案 0 :(得分:5)

您的功能无法执行您想要的操作,因为它不会为您不想要的值返回false,而为您想要的人返回true。考虑一下:

array1 = array1.filter(function(n) {
    for(var i=0; i < array2.length; i++){
      if(n.file == array2[i].file){
        return false;
      }
    }
    return true;
});

未测试。一旦在array2中找到元素,则返回false,否则返回true

答案 1 :(得分:2)

如果文件位于另一个数组中,您可以使用临时对象作为参考。

&#13;
&#13;
dev_appserver.py --datastore_path=/home/user/datastorefile.db 
&#13;
&#13;
&#13;

答案 2 :(得分:2)

这是一个使用一些内置数组方法的版本,使您更容易。它使用array.some返回true(当某些或甚至数组中的一个元素为测试用例返回true时)或false。反转,你有过滤结果。它看起来更干净!

var array1 = [{"file": "tttt.csv","media": "tttt"},{"file": "bob_bob.csv","media": "bob_bob"},{"file": "bob1_bob1.csv","media": "bob1_bob1"},];

var array2 = [{"title": "bob_bob","version": "bob","date": "27/4/2016","selected": false,"file": "bob_bob.csv","media": "bob_bob","exists": true},{"title": "bob1_bob1","version": "bob","date": "27/4/2016","selected": false,"file": "bob1_bob1.csv","media": "bob_bob","exists": true}]

var result = array1.filter(function(n1) {
  return !(array2.some(function(n2){
  	return n1.file === n2.file;
  }))
});

document.write('<pre>' + JSON.stringify(result))

答案 3 :(得分:2)

使用filtersome函数

&#13;
&#13;
var array1 = [{ "file": "tttt.csv", "media": "tttt" }, { "file": "bob_bob.csv", "media": "bob_bob" }, { "file": "bob1_bob1.csv", "media": "bob1_bob1" }, ];

var array2 = [{ "title": "bob_bob", "version": "bob", "date": "27/4/2016", "selected": false, "file": "bob_bob.csv", "media": "bob_bob", "exists": true }, { "title": "bob1_bob1", "version": "bob", "date": "27/4/2016", "selected": false, "file": "bob1_bob1.csv", "media": "bob_bob", "exists": true }]

var res = array1.filter(n => !array2.some(n2 => n.file == n2.file));

document.write(JSON.stringify(res));
&#13;
&#13;
&#13;

*解决方案使用ES6箭头功能,它可能无法在旧浏览器中使用