Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从数组中删除相等对象_Javascript - Fatal编程技术网

Javascript 从数组中删除相等对象

Javascript 从数组中删除相等对象,javascript,Javascript,我有一系列的颜色。我想删除一个等于另一个对象的对象 排列 反对 { id: 2, color: "blue" } 我不知道数组中的索引。理想情况下,它可能类似于array.removeobject 我怎样才能做到这一点呢?我用这个indexOf解决方案犯了一个错误,但我现在正在纠正自己: function indexOf(arr, val, comparer) { for (var i = 0, len = arr.length; i < len; ++i) {

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

排列

反对

{ id: 2, color: "blue" }
我不知道数组中的索引。理想情况下,它可能类似于array.removeobject


我怎样才能做到这一点呢?

我用这个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:

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

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:

假设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;
}

假设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;
}
这至少可以让你使用暴力方法来解决你的问题。循环遍历数组,然后比较每个对象

更紧凑、更优雅,但可能不符合您的需要

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



更紧凑、更优雅,但可能不符合您的需要。

什么表示两个对象相等?id和颜色属性都必须匹配还是只匹配颜色?两者都更好,但在这个场景中一个就足够了@KeluThatsall Uhh的可能副本,你认为你有错误的链接吗?这只是回到这个问题。两者都更好,但在这个场景中一个就足够了-在您给出的示例中,两个属性都不匹配,只有id。什么指示两个对象相等?id和颜色属性都必须匹配还是只匹配颜色?两者都更好,但在这个场景中一个就足够了@KeluThatsall Uhh的可能副本,你认为你有错误的链接吗?这只是链接回这个问题。两者都更好,但在这个场景中一个就足够了-在您给出的示例中,两个属性都不匹配,只有id。这不起作用。他有一个对象数组,而不是颜色数组。indexOf不会将对象作为参数,这必须是字符串,因此必须先将其放入循环中。@Deryck-。indexOf将接受一个对象,但这仍然不起作用,因为。indexOf使用严格相等,因此它只会删除同一个实例,不是属性设置为相同值的重复对象。嗯,这仍然不起作用。对象不会是==更不用说===仅仅因为它们的键具有相同的值。@Deryck-MDN非常好。只要谷歌[any JS term here]mdn,你就会被设置好。这不起作用。他有一个对象数组,而不是颜色数组。indexOf不会将对象作为参数,这必须是字符串,因此必须先将其放入循环中。@Deryck-。indexOf将接受一个对象,但这仍然不起作用,因为。indexOf使用严格相等,因此它只会删除同一个实例,不是属性设置为相同值的重复对象。嗯,这仍然不起作用。对象不会是==更不用说===仅仅因为它们的键具有相同的值。@Deryck-MDN非常好。只需谷歌[any JS term here]mdn,您就可以进行设置。他还可以通过向array.prototype添加类似的函数来获得所需的array.removeobject语法。@Matt-True。我不喜欢修改内置对象的原型,所以我将把它留给读者作为练习…我同意你的观点。。。我主要是把它作为一个暗示;。他还可以通过向array.prototype添加类似的函数来获得所需的array.removeobject语法。@Matt-True。我不喜欢修改内置对象的原型,所以我将把它留给读者作为练习…我同意你的观点。。。我主要是把它作为一个暗示;。