我有对象的这样一个数组:删除数组元素基于对象属性
var myArray = [
{field: 'id', operator: 'eq', value: id},
{field: 'cStatus', operator: 'eq', value: cStatus},
{field: 'money', operator: 'eq', value: money}
];
如何删除基于其特性的特定的一个?
例如我将如何删除数组对象与'钱'作为字段属性?
我有对象的这样一个数组:删除数组元素基于对象属性
var myArray = [
{field: 'id', operator: 'eq', value: id},
{field: 'cStatus', operator: 'eq', value: cStatus},
{field: 'money', operator: 'eq', value: money}
];
如何删除基于其特性的特定的一个?
例如我将如何删除数组对象与'钱'作为字段属性?
一种可能性:
myArray = myArray.filter(function(obj) {
return obj.field !== 'money';
});
请注意:filter
创建新的数组。尽管您使用新引用更新了原始变量myArray
,但引用原始数组的任何其他变量都不会获得过滤的数据。谨慎使用。
遍历整个数组,并splice
出你不想要的。为了方便使用,迭代向后所以你不必顾及阵列的活性质:
for (var i = myArray.length - 1; i >= 0; --i) {
if (myArray[i].field == "money") {
myArray.splice(i,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;
}
为什么不我能够依靠filter()? – imperium2335 2013-03-08 06:48:28
因为它是JavaScript 1.6的一部分,IE8和以下版本或旧版浏览器不支持它。 – 2013-03-08 07:01:19
以下是代码。 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的一个实用工具,带库,提供了很多功能的编程支持
这是一个离开网络的非常危险的例子......它可以与示例数据一起使用,但不能与其他任何东西一起使用。 splice(i)意味着它将删除数组中第一个实例的所有元素,其中第一个实例的值为金钱,而第二个实例的值不满足op的要求。如果我们更改为splice(i,1),它仍然是不正确的,因为它不会评估下一个顺序项目(您将不得不减少i)这就是为什么您应该向后处理数组中的删除操作,以便删除项目不会更改要处理的下一个项目的索引 – 2016-08-01 00:46:28
的下面是使用jQuery的grep另一种选择。通过true
作为确保grep的第三个参数将删除与您的功能匹配的项目。
users = $.grep(users, function(el, idx) {return el.field == "money"}, true)
如果您已经使用jQuery那么就不需要垫片,这是相对于使用Array.filter
可能是有用的。
您可以使用lodash的findIndex来获取特定元素的索引,然后使用它进行拼接。
myArray.splice(_.findIndex(myArray, function(item) {
return item.value === 'money';
}), 1);
什么是数组是树结构? – forgottofly 2017-01-18 11:34:11
@forgottofly树结构?我认为'myArray'是一个对象数组。 – Sridhar 2017-01-18 12:17:37
如果数组是一个树结构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
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
意味着将返回一个元素数组,失败你的函数逻辑。
您的解决方案非常清晰。谢谢 – 2017-06-06 15:24:46
请注意'filter()'确实只适用于Internet Explorer 9+ – jessegavin 2013-04-29 14:51:07
@jessegavin。我应该提到有很多好的* es5 shim *库可用,它们可以模拟这些功能(只是为了支持传统浏览器) – jAndy 2013-04-29 14:57:15
'filter()'创建一个新数组,这很好,如果你能够重新分配变量并且知道没有其他代码引用它的区域。如果您特别需要修改原始数组对象,这将不起作用。 – 2014-09-26 17:55:29