2013-03-08 79 views
119

我有对象的这样一个数组:删除数组元素基于对象属性

var myArray = [ 
    {field: 'id', operator: 'eq', value: id}, 
    {field: 'cStatus', operator: 'eq', value: cStatus}, 
    {field: 'money', operator: 'eq', value: money} 
]; 

如何删除基于其特性的特定的一个?

例如我将如何删除数组对象与'钱'作为字段属性?

回答

177

一种可能性:

myArray = myArray.filter(function(obj) { 
    return obj.field !== 'money'; 
}); 

请注意:filter创建新的数组。尽管您使用新引用更新了原始变量myArray,但引用原始数组的任何其他变量都不会获得过滤的数据。谨慎使用。

+5

请注意'filter()'确实只适用于Internet Explorer 9+ – jessegavin 2013-04-29 14:51:07

+0

@jessegavin。我应该提到有很多好的* es5 shim *库可用,它们可以模拟这些功能(只是为了支持传统浏览器) – jAndy 2013-04-29 14:57:15

+2

'filter()'创建一个新数组,这很好,如果你能够重新分配变量并且知道没有其他代码引用它的区域。如果您特别需要修改原始数组对象,这将不起作用。 – 2014-09-26 17:55:29

52

遍历整个数组,并splice出你不想要的。为了方便使用,迭代向后所以你不必顾及阵列的活性质:

for (var i = myArray.length - 1; i >= 0; --i) { 
    if (myArray[i].field == "money") { 
     myArray.splice(i,1); 
    } 
} 
+1

你是什么意思的阵列的生活性质? @Neit暗Absol – sisimh 2015-06-01 12:46:10

+20

@sisimh他的意思是说,如果你通过使用长度作为迭代逻辑的一部分来迭代数组,并且由于它的元素已被删除或添加,它的长度会发生变化,那么最终可能会从数组末尾运行或者不对数组中的每个项目进行操作。向后移动使得它不太可能,因为它向静态0索引而不是移动长度工作。 – Klors 2015-07-10 16:14:59

+1

感谢您的解释@ Klors :) – sisimh 2015-07-12 13:19:05

1

jAndy的解决方案可能是最好的,但如果你不能依靠过滤器,你可以这样做:如果你不使用jQuery

var myArray = [ 
    {field: 'id', operator: 'eq', value: 'id'}, 
    {field: 'cStatus', operator: 'eq', value: 'cStatus'}, 
    {field: 'money', operator: 'eq', value: "money"} 
]; 

myArray.remove_key = function(key){ 
    var i = 0, 
     keyval = null; 
    for(; i < this.length; i++){ 
     if(this[i].field == key){ 
      keyval = this.splice(i, 1); 
      break; 
     } 
    } 
    return keyval; 
} 
+1

为什么不我能够依靠filter()? – imperium2335 2013-03-08 06:48:28

+2

因为它是JavaScript 1.6的一部分,IE8和以下版本或旧版浏览器不支持它。 – 2013-03-08 07:01:19

3

以下是代码。 Demo

var myArray = [ 
    {field: 'id', operator: 'eq', value: 'id'}, 
    {field: 'cStatus', operator: 'eq', value: 'cStatus'}, 
    {field: 'money', operator: 'eq', value: 'money'} 
]; 

alert(myArray.length); 

for(var i=0 ; i<myArray.length; i++) 
{ 
    if(myArray[i].value=='money') 
     myArray.splice(i); 
} 

alert(myArray.length); 

您还可以使用具有许多功能的下划线库。

Underscore是JavaScript的一个实用工具,带库,提供了很多功能的编程支持

+3

这是一个离开网络的非常危险的例子......它可以与示例数据一起使用,但不能与其他任何东西一起使用。 splice(i)意味着它将删除数组中第一个实例的所有元素,其中第一个实例的值为金钱,而第二个实例的值不满足op的要求。如果我们更改为splice(i,1),它仍然是不正确的,因为它不会评估下一个顺序项目(您将不得不减少i)这就是为什么您应该向后处理数组中的删除操作,以便删除项目不会更改要处理的下一个项目的索引 – 2016-08-01 00:46:28

7

的下面是使用jQuery的grep另一种选择。通过true作为确保grep的第三个参数将删除与您的功能匹配的项目。

users = $.grep(users, function(el, idx) {return el.field == "money"}, true) 

如果您已经使用jQuery那么就不需要垫片,这是相对于使用Array.filter可能是有用的。

4

您可以使用lodash的findIndex来获取特定元素的索引,然后使用它进行拼接。

myArray.splice(_.findIndex(myArray, function(item) { 
    return item.value === 'money'; 
}), 1); 
+0

什么是数组是树结构? – forgottofly 2017-01-18 11:34:11

+0

@forgottofly树结构?我认为'myArray'是一个对象数组。 – Sridhar 2017-01-18 12:17:37

+1

如果数组是一个树结构var beforeDeleteOperationArray = [{“id”:3.1,“name”:“test 3.1”,“activityDetails”:[{“id”:22,“name”:“test 3.1”}) ,{“id”:23,“name”:“changed test 23”}]}]我想删除id:23 – forgottofly 2017-01-18 13:59:15

2
var myArray = [ 
    {field: 'id', operator: 'eq', value: id}, 
    {field: 'cStatus', operator: 'eq', value: cStatus}, 
    {field: 'money', operator: 'eq', value: money} 
]; 
console.log(myArray.length); //3 
myArray = $.grep(myArray, function(element, index){return element.field == "money"}, true); 
console.log(myArray.length); //2 

元件阵列中的一个对象。 第三个参数true意味着将返回一个元素数组,其失败了你的函数逻辑,false意味着将返回一个元素数组,失败你的函数逻辑。

+1

您的解决方案非常清晰。谢谢 – 2017-06-06 15:24:46