对象交集数组

Array of objects intersection

本文关键字:数组 对象      更新时间:2023-09-26

我有两个对象列表,我想过滤我的array1,而没有array2中的file键:

我做了什么:

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"
    }
]

使用 filtersome 函数

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

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

你的函数不会做你想要的,因为它不会为你不想要的值返回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

这是一个使用一些内置数组方法的版本,可以让你更容易做到这一点。它使用 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))

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

var array1 = [{ "file": "tttt.csv", "media": "tttt" }, { "file": "bob_bob.csv", "media": "bob_bob" }, { "file": "bob1_bob1.csv", "media": "bob1_bob1" }],
    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 }],
    temp = Object.create(null);
array2.forEach(function (a) {
    temp[a.file] = true;
});
array1 = array1.filter(function (a) {
    return !temp[a.file];
});
document.write('<pre>' + JSON.stringify(array1, 0, 4) + '</pre>');

在本例中数组与_id相交

arraysOfFilterArrays = [array1, array2,array3,array4];
      beforeReady = arraysOfFilterArrays.reduce((a, b) => a.filter(a => b.some(b => a.id === b.id)));
        console.log(beforeReady);