我有一个这样的对象数组:
var myArray = [ {field: 'id', operator: 'eq', value: id}, {field: 'cStatus', operator: 'eq', value: cStatus}, {field: 'money', operator: 'eq', value: money} ];
我如何删除一个特定的基于它的属性?
例:我该如何移除以“money”作为字段属性的数组对象?
遍历数组,splice剔除你不想要的元素。为了更容易使用,向后迭代,这样你就不必考虑数组的活动性质:
splice
for (var i = myArray.length - 1; i >= 0; --i) { if (myArray[i].field == "money") { myArray.splice(i,1); } }
一种可能性:
myArray = myArray.filter(function( obj ) { return obj.field !== 'money'; });
请注意,filter创建了一个新数组。任何其他引用原始数组的变量都不会得到过滤后的数据,尽管你用新的引用更新了原始变量myArray。请谨慎使用。
filter
myArray
jAndy的解决方案可能是最好的,但如果你不能依赖过滤器,你可以这样做:
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; }
如果不使用jQuery,下面是代码。演示
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);
你也可以使用下划线库,它有很多功能。
下划线是JavaScript的一个实用带库,提供了大量的函数式编程支持
下面是使用jQuery grep的另一个选项。传递true作为第三个参数,以确保grep删除与函数匹配的项。
true
users = $.grep(users, function(el, idx) {return el.field == "money"}, true)
如果你已经使用jQuery,那么不需要shim,这可能是有用的,而不是使用Array.filter。
Array.filter
你可以使用lodash的findIndex来获取特定元素的索引,然后使用它进行拼接。
myArray.splice(_.findIndex(myArray, function(item) { return item.value === 'money'; }), 1);
更新
你也可以使用ES6的findIndex ()
findIndex()方法返回数组中满足所提供测试函数的第一个元素的索引。否则返回-1。
const itemToRemoveIndex = myArray.findIndex(function(item) { return item.field === 'money'; }); // proceed to remove an item only if it exists. if(itemToRemoveIndex !== -1){ myArray.splice(itemToRemoveIndex, 1); }
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
Element是数组中的一个对象。 第三个参数true表示返回一个元素数组,这个数组的函数逻辑不符合你的要求;false表示返回一个元素数组,这个数组的函数逻辑不符合你的要求
false
假设你想通过它的field属性移除第二个对象。
用ES6就这么简单。
myArray.splice(myArray.findIndex(item => item.field === "cStatus"), 1)
使用 浪荡库:
var myArray = [ {field: 'id', operator: 'eq', value: 'id'}, {field: 'cStatus', operator: 'eq', value: 'cStatus'}, {field: 'money', operator: 'eq', value: 'money'} ]; var newArray = _.remove(myArray, function(n) { return n.value === 'money';; }); console.log('Array'); console.log(myArray); console.log('New Array'); console.log(newArray);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.js"></script>
基于上面的一些注释,下面是如何根据键名和键值删除对象的代码
var items = [ { "id": 3.1, "name": "test 3.1"}, { "id": 22, "name": "test 3.1" }, { "id": 23, "name": "changed test 23" } ] function removeByKey(array, params){ array.some(function(item, index) { return (array[index][params.key] === params.value) ? !!(array.splice(index, 1)) : false; }); return array; } var removed = removeByKey(items, { key: 'id', value: 23 }); console.log(removed);
在 ES6里,只有一句台词。
const arr = arr.filter(item => item.key !== "some value");
:)
我们可以使用以下两种方法基于属性删除元素。
testArray.filter(prop => prop.key !== 'Test Value')
const index = testArray.findIndex(prop => prop.key === 'Test Value') testArray.splice(index,1)