我有一个数组和一个对象数组。我想在对象数组中搜索数组中的每个值,如果它不存在,我想从数组中删除该值。
var arr= [1,2,3,4];
var recs = [{id:1},{id:2},{id:3}]; //4 doesnt exist in recs, remove from arr
//arr = [1,2,3];
继承我的尝试。显然不起作用。在移动下一个arr索引之前,我不确定如何将每个arr索引与recs中的所有值进行比较:
var arr= [1, 2, 3, 4], index;
var recs = [{a:1},{a:2},{a:3}];
for(var i = 0; i<arr.length; i++){
for(var val in recs[i]){
if(arr[i] != recs[i][val]){
index = arr.indexOf(arr[i]);
arr.splice(index, 1);
}
}
}
谢谢!!
答案 0 :(得分:4)
如果您可以单独保留原始数组实例并创建一个新实例(基本上将其视为不可变)
var newArr = arr.filter(function(num) {
return !recs.every(function(obj) {
return obj.a !== num;
});
});
使用的方法的详细信息:Array.filter
传递一个函数,在内部的每个元素上运行该函数,然后返回一个新的数组,只包含在函数中返回true的元素。
Array.every
有点类似,但返回一个布尔值,true或false。如果数组的所有元素都在函数内部返回true
,则返回true。
答案 1 :(得分:0)
var arr= [1, 2, 3, 4];
var recs = [{a:1},{a:2},{a:3}];
// don't use var in for loops.
// Variables declared with var have function scope, so declare them at the top of your function
var i;
var j;
var value;
var found;
// iterate over the array
for (i = 0; i < arr.length; i++)
{
value = arr[i];
found = false;
// iterate over the other array
for (j = 0 ; j < recs.length ; j++)
{
// if we found what we were looking for, make a note and exit loop
if (recs[j].a == value)
{
found = true;
break;
}
}
if (!found)
{
arr.splice(i, 1);
// To compensate the loop's i++, to avoid skipping the next entry
i--;
}
}
alert(arr.join(','));