对象交集数组
Array of objects intersection
我有两个对象列表,我想过滤我的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"
}
]
使用 filter
和 some
函数
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);
相关文章:
- 将数组对象传递到struts2中的操作类
- 如何使用jquery返回php-json数组对象
- 从其名称获取javascript数组对象
- 值未与数组对象绑定
- 如何按数组/对象值的倍数过滤对象数组
- 在表中显示数组对象
- 在数组对象中分组
- 将第二个或多个数组推送到数组对象 AngularJS 中
- 重新排列 JavaScript 数组/对象
- 键上的javascript数组对象过滤器
- handontable:在不更改数据数组/对象的情况下隐藏某些列
- 用于跟踪购物车可用性的Javascript数组/对象/哈希表
- 重建有角度的java脚本数组对象
- 对JSON数组对象进行排序
- 连接与数组对象相关的文本:方式和位置
- 哪些浏览器和版本支持将常见的类数组对象直接传递到fn.apply()
- 如何使用Handlebars循环数组对象和模板
- 是否可以引用JS数组/对象中的另一个元素
- Javascript中的名称索引-数组/对象
- 数组长度不等于数组对象