Javascript 如何按对象从对象文字数组中删除对象文字

Javascript 如何按对象从对象文字数组中删除对象文字,javascript,arrays,Javascript,Arrays,从“objects literal”数组中删除“object literal”的最通用方法是什么(可能是javascript),我的意思是如何确定要删除的对象的索引是什么 键是相同的,只有值可以更改 假设我们有 arrObj = [{k: "a"},{k: "b"},{k: "c"},{k: "d"}]; //{k: "a"} 只是一个项目文本的示例,但每个对象也可以像这样嵌套 {k: "a", {y: {z: "c"}} } 我想定义一个函数文字,它能够实现以下功能: var remove

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

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

假设我们有

arrObj = [{k: "a"},{k: "b"},{k: "c"},{k: "d"}]; //{k: "a"}
只是一个项目文本的示例,但每个对象也可以像这样嵌套

{k: "a", {y: {z: "c"}} }
我想定义一个函数文字,它能够实现以下功能:

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

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

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


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

可能有更好的方法来完成您正在做的事情。要在这里实现所需的解决方案,需要迭代数组,然后比较对象。一种解决方案是使用JSON,尽管在需要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);
    }
}
函数从数组中移除(arr,obj){
obj=JSON.stringify(obj);
对于(变量i=0,max=arr.length;i
工作示例:

注意,正如cdhowie在评论中提到的,迭代的顺序是一个JSON因素,对象属性需要以相同的顺序定义。但是,如果没有JSON,您必须迭代每个对象的键,并多次迭代参数中传递的对象,以确保两个对象包含相同的键和相同的值,这使得它比本机JSON更复杂,速度也慢得多


正如我在第一句话中所说,“无论你在做什么,可能都有更好的方法”,你最好再看看你的方法。

你没有“对象文字数组”。您有一个对象数组。每个对象都是从一个对象文字创建的,它是词法符号——字符序列,因此是“文字”——您在代码中键入的。什么是函数文字?!
JSON.stringify()
是否保证键值对在输出字符串中出现的顺序?如果顺序不可预测,则此代码可能会在其他相同对象上失败。@cdhowie:在兼容性实现中,大多数浏览器都会要求以相同的顺序定义对象键。至于本机实现,我不确定,但我猜同样适用。无论哪种方式,这都是一个很好的观点,在正确实现之前需要进行一些研究。我仍然认为这是一个不错的解决方案,因为比较对象要复杂得多。然而,我确实认为OP可以避免完全这样做,并采取更好的方法来解决他的问题。明白。如果定义了键顺序,这是一种很好的方法。