从数组中删除相等的对象

时间:2013-11-28 14:33:48

标签: javascript

我有一系列颜色。我想删除一个等于另一个对象的文件。

阵列

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

对象

{ id: 2, color: "blue" }

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

我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:3)

假设“相等”意味着“拥有相同的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) {

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

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)) {

答案 1 :(得分:2)

我对这个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);
}

小提琴: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;
});

小提琴:http://jsfiddle.net/AtGnY/14/

答案 2 :(得分:0)

Similar question

这至少可以让您访问强力方法来解决您的问题。循环遍历数组,然后比较每个对象。

Find an object by ID更紧凑,更优雅,但可能无法满足您的需求。