根据object属性删除数组元素

imp*_*335 236 javascript arrays jquery properties object

我有一个像这样的对象数组:

var myArray = [
    {field: 'id', operator: 'eq', value: id}, 
    {field: 'cStatus', operator: 'eq', value: cStatus}, 
    {field: 'money', operator: 'eq', value: money}
];
Run Code Online (Sandbox Code Playgroud)

如何根据其属性删除特定的?

例如,如何使用'money'作为字段属性删除数组对象?

jAn*_*ndy 321

一种可能性:

myArray = myArray.filter(function( obj ) {
    return obj.field !== 'money';
});
Run Code Online (Sandbox Code Playgroud)

请注意,filter创建一个新阵列.引用原始数组的任何其他变量都不会获得过滤后的数据,尽管您myArray使用新引用更新原始变量.谨慎使用.

  • 请注意,`filter()`仅适用于Internet Explorer 9+ (6认同)
  • `filter()`创建一个新数组,如果你能够重新分配变量并且知道没有其他代码区域可以引用它,那就没问题了.如果您特别需要修改原始数组对象,这将不起作用. (3认同)
  • 如果数组是一个树结构,那么在deleteOperationArray = [{"id":3.1,"name":"test 3.1","activityDetails":[{"id":22,"name":"test 3.1"}, {"id":23,"name":"已更改测试23"}}}]我想删除id:23 (2认同)

Nie*_*sol 81

遍历数组,然后splice输出你不想要的数组.为了便于使用,请向后迭代,这样您就不必考虑数组的实时特性:

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

  • @sisimh他的意思是,如果你通过使用它的长度作为迭代逻辑的一部分来迭代数组并且它的长度发生变化,因为它删除或添加了元素,你可以最终运行数组的末尾或不执行操作数组中的每个项目.向后移动使得它更不可能因为它朝向静态0索引而不是移动长度. (27认同)
  • 你对阵列的直播性质是什么意思?@Neit the Dark Absol (3认同)
  • 如果数组是树结构 ar beforeDeleteOperationArray=[ { "id": 3.1, "name": "test 3.1", "activityDetails": [ { "id": 22, "name": "test 3.1" }, { "id": 23, "name": "changed test 23" } ] } ] 我想删除 id:23 (2认同)

Sup*_*nda 34

在 ES6 中,只有一行。

const arr = arr.filter(item => item.key !== "some value");
Run Code Online (Sandbox Code Playgroud)

:)

  • 请记住,过滤器会创建一个新数组。 (6认同)

Per*_*cek 20

假设您要通过它的field属性删除第二个对象.

使用ES6就可以轻松实现.

myArray.splice(myArray.findIndex(item => item.field === "cStatus"), 1)
Run Code Online (Sandbox Code Playgroud)

  • @CompaqLE2202x 2年后,这对您来说可能已经很明显了,但对于未来的开发人员来说:“splice”更改了原始数组,因此您返回的值是被删除的项目,但如果您接下来查看“myArray”,该项目将失踪了。 (8认同)
  • 如果 findIndex 没有找到该元素,则返回 -1,并通过 splice 删除最后一个元素,尽管它与谓词不匹配。 (8认同)
  • 我尝试了这个,但不是从OP的数组中"删除"第3项,而是将代码"过滤"并仅显示第3项. (3认同)

Sri*_*har 14

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

myArray.splice(_.findIndex(myArray, function(item) {
    return item.value === 'money';
}), 1);
Run Code Online (Sandbox Code Playgroud)

更新

你也可以使用ES6的findIndex()

findIndex()方法返回数组中第一个满足提供的测试函数的元素的索引.否则返回-1.

myArray.splice(myArray.findIndex(myArray, function(item) {
    return item.value === 'money';
}), 1);
Run Code Online (Sandbox Code Playgroud)

  • 如果数组是树结构var beforeDeleteOperationArray = [{"id":3.1,"name":"test 3.1","activityDetails":[{"id":22,"name":"test 3.1"}, {"id":23,"name":"已更改测试23"}}}]我想删除id:23 (3认同)
  • 如果findIndex(ES6版本)没有找到该元素,则返回-1,并通过拼接删除最后一个元素,尽管它与谓词不匹配。 (2认同)

sif*_*day 8

这是使用jQuery grep的另一个选项.true作为第三个参数传递,以确保grep删除与您的函数匹配的项目.

users = $.grep(users, function(el, idx) {return el.field == "money"}, true)
Run Code Online (Sandbox Code Playgroud)

如果您已经在使用jQuery,则不需要填充程序,这可能是有用的而不是使用Array.filter.


小智 7

我们可以使用以下 2 种方法根据属性删除元素。

  1. 使用过滤方法
testArray.filter(prop => prop.key !== 'Test Value')
Run Code Online (Sandbox Code Playgroud)
  1. 采用拼接法。对于这种方法,我们需要找到属性的索引。
const index = testArray.findIndex(prop => prop.key === 'Test Value')
testArray.splice(index,1)
Run Code Online (Sandbox Code Playgroud)