如何通过对象从对象文字数组中删除对象文字

时间:2011-09-05 17:11:49

标签: javascript arrays

从“对象文字”数组中删除“对象文字”的最常用方法(可能在javascript中)是什么,我的意思是如何确定要删除的对象的索引是什么。

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

假设我们有

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

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

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

我想定义一个能够制作这个东西的函数文字:

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

2 个答案:

答案 0 :(得分:1)

可能有更好的方法来做你正在做的事情。要在此处获得所需的解决方案,您需要迭代数组并然后比较对象。一种解决方案是使用JSON,尽管您会在需要compatibility shim的旧版浏览器中看到性能损失。如果您不需要比较功能,这只是一个可行的解决方案。这样的事情应该有效:

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相比要慢很多。

正如我在第一句话中所说的那样,“可能有更好的方法来做你正在做的事情”,你可能最好再看看你的做法。< / p>

答案 1 :(得分:0)

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

如果您知道他们总是有一个名为“k”的键,您可以对此进行比较,但我想您正在寻找更通用的解决方案?

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