正在从数组中删除相等的对象

Removing an equal object from array

本文关键字:对象 删除 数组      更新时间:2023-11-23

我有一个颜色数组。我想删除一个等于另一个对象的对象。

阵列

[
    { id: 1, color: "red"},
    { id: 2, color: "blue"},
]

对象

{ id: 2, color: "blue" }

我不知道数组中的index。理想情况下,它可以是类似array.remove(object)的东西。

我怎样才能做到这一点?

假设"equal"意味着"具有相同的id",您只需要一个循环和一个if测试:

function removeItem(array, item) {
    for (var i = array.length - 1; i >= 0; i--)
        if (array[i].id === item.id) {
            array.splice(i, 1);
            break; // remove this line if there could be multiple matching elements
        }
}
var array = [
        { id: 1, color: "red"},
        { id: 2, color: "blue"},
    ];
removeItem(array, { id: 2, color : "blue"});

显然,您可以将其扩展到测试这两种属性:

        if (array[i].id === item.id && array[i].color === item.color) {

如果您希望能够比较具有未知属性名称的任意对象,那么可以使用嵌套的for..in循环来测试每个属性,而不是简单的if测试,或者类似于以下(未经测试):

function equalObjects(o1, o2) {
    var okeys1 = Object.keys(o1);
    if (okeys1.length != Object.keys(o2).length)
        return false;
    for (var i = 0; i < okeys1.length; i++)
        if (o1[okeys1[i]] !== o2[okeys1[i]])
            return false;
    return true;
}

然后在我原来的功能:

         if (equalObjects(array[i], item)) {

我在这个indexOf解决方案中犯了一个错误,但我现在正在纠正自己:

function indexOf(arr, val, comparer) {
    for (var i = 0, len = arr.length; i < len; ++i) {
        if ( i in arr && comparer(arr[i], val) ) {
            return i;
        }
    }
    return -1;
}
var index = indexOf(array,someObject, function(o1,o2) { return o1.id == o2.id && o1.color == o2.color; });
if (index > -1) {
    array.splice(index, 1);
}

Fiddle:http://jsfiddle.net/AtGnY/5/

如果你想以这种方式调用它:array.remove(object),那么你可以这样写代码:

Array.prototype.remove = function (object, comparer) {
    if (!comparer) {
        comparer = function (o1, o2) {
            return o1 === o2;
        };
    }
    var index = -1;
    for (var i = 0, len = this.length; i < len; ++i) {
        if (i in this && comparer(this[i], object)) {
            index = i;
        }
    }
    if (index > -1) {
        array.splice(index, 1);
    }
};
array.remove(object, function (o1, o2) {
    return o1.id == o2.id && o1.color == o2.color;
});

Fiddle:http://jsfiddle.net/AtGnY/14/

类似问题

这至少会让你使用暴力方法来解决你的问题。循环遍历数组,然后比较每个对象。

通过ID查找对象更紧凑、更优雅,但可能与您的需求不匹配。