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

How to properly delete object from array?

我有一个 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 根本不起作用。

您想使用 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 个对象并且不会留下未定义的挂在那里。

通常使用 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

不要试图就地修改一个数组,这很混乱且容易出错,只需使用 filter 创建一个新数组并将其分配回原始数组:

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