我有两个对象列表,我想在没有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"
}
]
答案 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)
如果文件位于另一个数组中,您可以使用临时对象作为参考。
dev_appserver.py --datastore_path=/home/user/datastorefile.db
&#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)
使用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));
&#13;
*解决方案使用ES6箭头功能,它可能无法在旧浏览器中使用