我有一个像这样的对象数组:
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'作为字段属性的数组对象?
Answers:
一种可能性:
myArray = myArray.filter(function( obj ) {
return obj.field !== 'money';
});
请注意,将filter
创建一个新数组。尽管您myArray
使用新的引用更新了原始变量,但其他任何引用原始数组的变量都不会获取过滤后的数据。请谨慎使用。
filter()
创建一个新的数组,如果您能够重新分配该变量并且知道没有其他代码区域可以引用该变量,那将是一个很好的选择。如果您特别需要修改原始数组对象,则此方法将无效。
遍历数组,然后splice
删除不需要的数组。为了更容易使用,请向后迭代,这样您就不必考虑数组的实时特性:
for (var i = myArray.length - 1; i >= 0; --i) {
if (myArray[i].field == "money") {
myArray.splice(i,1);
}
}
假设您要通过第二个对象的field属性来删除它。
使用ES6,就这么简单。
myArray.splice(myArray.findIndex(item => item.field === "cStatus"), 1)
splice
更改原始数组,因此您获得的值是被删除的项目,但是如果您下次查看myArray
该项目,将会丢失。
您可以使用lodash的findIndex获取特定元素的索引,然后使用该元素进行拼接。
myArray.splice(_.findIndex(myArray, function(item) {
return item.value === 'money';
}), 1);
更新资料
您还可以使用ES6的findIndex()
findIndex()方法返回满足提供的测试功能的数组中第一个元素的索引。否则返回-1。
myArray.splice(myArray.findIndex(myArray, function(item) {
return item.value === 'money';
}), 1);
myArray
这是一组对象。
在ES6中,只有一行。
const arr = arr.filter(item => item.key !== "some value");
:)
如果您不使用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);
您还可以使用下划线库,该库具有很多功能。
Underscore是JavaScript实用程序带库,可提供许多功能性编程支持
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
意味着将返回使您的功能逻辑失败的元素数组。
使用lodash库:
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);
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;
}
filter()
仅适用于Internet Explorer 9+