我有一个像这样的数组
var arrayFilterKeyValues=[{id:1,name:"one"},{id:2,name:"2"}..]
我有另一个像这样的数组
var valuesArr=["1","2","3","4"...]
现在,如果ID位于arrayFilterKeyValues
,我正尝试从valuesArr
删除元素。这是我正在使用的代码
for (var i = 0; i < arrayFilterKeyValues.length; ++i) {
var found = false;
for (var k = 0; k < valuesArr.length; k++) {
if (arrayFilterKeyValues[i].id == valuesArr[k]) {
found = true;
break;
}
}
if (found) {
delete arrayFilterKeyValues[i];
}
}
这是删除元素但是当我检查数组时它在数组中有逗号(,
),当我检查长度时,它仍然显示删除元素之前数组的长度。我在这做错了什么?需要兼容IE8 +的解决方案
答案 0 :(得分:3)
arrayFilterKeyValues = arrayFilterKeyValues.filter(function (el) {
return valuesArr.indexOf(el.id) === -1;
});
jQuery版
arrayFilterKeyValues = $.grep(arrayFilterKeyValues, function (el) {
return $.inArray(el.id, valuesArr) === -1;
});
<强>更新强>
当我检查数组时,它有逗号(,)
这是因为
删除数组元素时,数组长度不受影响。 Deleting array elements
答案 1 :(得分:0)
delete
运算符从对象中删除属性。
如果删除数组元素时数组,则不会影响数组长度。即使您删除数组的最后一个元素并且该元素在数组中不可用,这也成立。
消息来源:CLICK HERE
要从数组中删除元素,请使用以下
for (var i = 0; i < arrayFilterKeyValues.length; ++i) {
var found = false;
for (var k = 0; k < valuesArr.length; k++) {
if (arrayFilterKeyValues[i].id == valuesArr[k]) {
found = true;
break;
}
}
if (found) {
var removedele = arrayFilterKeyValues.splice(i, 1);
}
}
答案 2 :(得分:0)
我发现在就地更新数组时经常使用的模式是读写:
var wp = 0, n=arrayFilterKeyValues.length;
for (var rp=0; rp<n; rp++) {
if (valuesArr.indexOf(arrayFilterKeyValues[rp].id) == -1) {
arrayFilterKeyValues[wp++] = arrayFilterKeyValues[rp];
}
}
arrayFilterKeyValues.splice(wp);
即。保持编写器指针wp
从0开始,并对要保留的每个元素执行元素复制arr[wp++]=arr[rp]
操作。最后,您可以调整阵列的大小。
但是使用Javascript,filter
数组方法已经完成了这种操作,唯一的问题就是返回一个新的独立数组。可能通过不分配新元素而获得的效率不值得额外编码。
var new_arr = arrayFilterKeyValues.filter(function(x) {
return valuesArr.indexOf(x.id) == -1;
});
arrayFilterKeyValues.splice(0);
arrayFilterKeyValues.push.apply(arrayFilterKeyValues, new_arr);
尽管做了额外的内存分配,可能会更有效率。
而不是splice
/ push
操作可能是对arrayFilterKeyValues
的简单分配是可以接受的,但请注意,您不是&#34;更新&#34;在这种情况下,数组,但为同一个变量分配一个新数组。
如果在其他地方引用相同的对象,则会有所不同。