[英]How to remove an object literals from an array of object literals by object
什么是从“对象文字”数组中删除“对象文字”的最通用方法(可能是在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"}
无论您正在做什么,可能都有更好的方法。 为了实现您想要的解决方案,您需要遍历数组, 然后比较对象。 一种解决方案是使用JSON,尽管在需要兼容性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相比要慢得多。
正如我在第一句话中所说的: “可能有更好的方式来做您正在做的事情” ,而您最好再看看您的方法。
您需要定义两个对象何时“相同”。 在您的示例中, removeObjFromArray
的参数实际上是与数组中的对象不同的对象(如果通过引用进行比较),因为每种文字语法都会创建一个不同的对象。
如果您知道他们总是有一个名为“ k”的密钥,您可以对此进行比较,但是我想您正在寻找更通用的解决方案?
如果两个对象具有相同的属性且具有相同的值,则可以确定两个对象是相同的(如果是对象,则进行递归比较)。 但这实际上取决于程序的用例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.