如何从数组中正确删除对象?

时间:2015-03-23 11:41:46

标签: javascript jquery arrays object

我有一个javascript函数,可以从对象数组中删除对象:

function RemoveFilter(filtArray,filtName) {
    var filtCount = filtArray.length;

    ...
    ...

    for (var i = 0; i < filtCount; i++) {
        var filter = filtArray[i];
        if (filter != undefined && filter.name == filtName) {
            delete filtArray[i];
        }
    }

    ...
    ...
}

它有效,但我遇到了大问题不是完全删除对象,而是保留未定义的位置(这就是为什么我的if filter != undefined)。

所以基本上,如果我在删除后添加一些东西,我不仅有新的值,还有那些未被破坏的,并且数组正在增长。

我删除对象的选择可能很差但是,我该如何处理这个问题呢? 考虑到filtArray[i].remove根本不起作用。

3 个答案:

答案 0 :(得分:3)

使用filter创建一个新数组并将其分配回原始数组,而不是尝试修改一个混乱且容易出错的数组:

myArray = myArray.filter(function(item) {
    return item.name !== name
});

答案 1 :(得分:2)

您想使用splice()而不是删除。这应该有用。

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.splice(2, 0, "Lemon", "Kiwi");

会给:

Banana,Orange,Lemon,Kiwi,Apple,Mango

如果您不想在删除其他元素的同时添加新元素,则可能需要执行此操作;

fruits.splice(2, 1);

结果将是:

Banana,Orange,Lemon

W3Schools

无耻地复制

在你的情况下,

function RemoveFilter(filtArray,filtName) {
    var filtCount = filtArray.length;
    for (var i = 0; i < filtCount; i++) {
        var filter = filtArray[i];
        if (filter != undefined && filter.name == filtName) {
            filtArray.splice(i,1);
        }
    }
}

这将删除第i个对象,而不会在那里留下未定义的对象。

答案 2 :(得分:0)

使用splice()通常是要走的路,你可以通过这样的方式使它变得干净:

function removeFilter(filtArray, filtName) {
  var index = filtArray.indexOf(filtName);
  filtArray.splice(index, 1);
}

您可以详细了解splice() here

编辑:

为您举例:

var dog = {name: 'Spot', type: 'Dog'}; 
var cat = {name: 'Meow', type: 'Cat'}; 
var animals = [dog, cat];

removeFilter(animals, dog); // -> Removes the dog object from the array

console.log(animals) // -> Only has the cat object remaining