如何按对象从对象字面值数组中删除对象字面值



从"object literal"数组中删除"object literal"最通用的方法是什么(可能在javascript中),我的意思是如何确定要删除的对象的索引是什么。

键是相同的,只有值可以改变。

假设我们有

arrObj = [{k: "a"},{k: "b"},{k: "c"},{k: "d"}]; //{k: "a"}

只是对象字面量的一个例子,但是每个对象也可以嵌套得更像这样

{k: "a", {y: {z: "c"}} }

我想定义一个函数literal它能写出这样的东西

var removeObjFromArray = function (obj){ ... };    
arrObj.removeObjFromArray({k: "b"}); // {k: "a"},{k: "c"},{k: "d"}

可能有更好的方法来做你正在做的事情。要实现这里想要的解决方案,需要遍历数组,然后比较对象。一种解决方案是使用JSON,尽管在需要兼容性改进的旧浏览器中可能会出现性能下降。只有在不需要比较函数时,这才是可行的解决方案。像这样的代码应该可以工作:

function removeFromArray(arr, obj) {
    obj = JSON.stringify(obj);
    for (var i=0, max = arr.length; i < max; i++) {
        if (JSON.stringify(arr[i]) === obj)
            arr.splice(i, 1);
    }
}

示例:http://jsfiddle.net/4JmzV/

注意,正如cdhowie在注释中提到的,迭代顺序是JSON的一个因素,对象属性需要以相同的顺序定义。但是,如果没有JSON,您必须遍历每个对象的键,遍历在参数中传递的对象多次,以确保两个对象包含相同的键和相同的值,使其成为一个更复杂的任务,比原生JSON慢得多。

正如我在第一句话中所说的,"可能有更好的方法来做你正在做的事情",你最好重新审视一下你的方法。

您需要定义两个对象何时"相同"。在您的示例中,removeObjFromArray的参数实际上是一个与数组中的对象不同的对象(如果通过引用进行比较),因为每个字面语法创建一个不同的对象。

如果你知道他们总是有一个名为"k"的键,你可以比较,但我猜你是在寻找一个更一般的解决方案?

如果两个对象具有相同的属性和相同的值(在对象的情况下递归比较),则可以确定它们是相同的。但这实际上取决于你的程序的用例。

最新更新