我有一个像这样的对象数组:
var myArray = [
{field: 'id', operator: 'eq', value: id},
{field: 'cStatus', operator: 'eq', value: cStatus},
{field: 'money', operator: 'eq', value: money}
];
我如何根据属性删除特定的数组对象?
例如,我如何删除字段属性为“money”的数组对象?
我有一个像这样的对象数组:
var myArray = [
{field: 'id', operator: 'eq', value: id},
{field: 'cStatus', operator: 'eq', value: cStatus},
{field: 'money', operator: 'eq', value: money}
];
我如何根据属性删除特定的数组对象?
例如,我如何删除字段属性为“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);
}
}
假设您想根据其字段属性删除第二个对象。
使用 ES6,只需这样即可。
myArray.splice(myArray.findIndex(item => item.field === "cStatus"), 1)
splice
会改变原始数组,所以你得到的值是被移除的那个元素,但如果你接下来查看 myArray
,该项将会消失。 - David Mulder在ES6中,只需要一行代码。
const arr = arr.filter(item => item.key !== "some value");
:)
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);
}
myArray
是一个对象数组。 - SridhartestArray.filter(prop => prop.key !== 'Test Value')
const index = testArray.findIndex(prop => prop.key === 'Test Value') testArray.splice(index,1)
使用jQuery grep还有另一种选择。将true
作为第三个参数传递以确保grep删除与您的函数匹配的项。
users = $.grep(users, function(el, idx) {return el.field == "money"}, true)
如果您已经在使用jQuery,则不需要使用shim,这可能比使用Array.filter
更有用。
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
表示将返回一个符合函数逻辑的元素数组。
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);
filter()
仅适用于Internet Explorer 9+。 - jessegavinfilter()
方法创建一个新的数组,如果你能够重新分配变量并且知道没有其他代码区域引用它,那么这很好。但是,如果你需要修改原始数组对象,则无法使用该方法。 - Brian Glick