根据对象属性删除数组元素

IT技术 javascript jquery arrays object properties
2021-01-24 22:40:05

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

var myArray = [
    {field: 'id', operator: 'eq', value: id}, 
    {field: 'cStatus', operator: 'eq', value: cStatus}, 
    {field: 'money', operator: 'eq', value: money}
];

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

例如,我将如何删除以 'money' 作为字段属性的数组对象?

6个回答

一种可能:

myArray = myArray.filter(function( obj ) {
    return obj.field !== 'money';
});

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

@forgottofly 好点 - 答案仅适用于有限的情况。您找到问题的答案了吗?
2021-03-15 22:40:05
filter()创建一个新数组,如果您能够重新分配变量并且知道没有其他代码区域引用它,那么这很好。如果您特别需要修改原始数组对象,这将不起作用。
2021-03-19 22:40:05
@jessegavin确实。我应该提到有很多很好的es5 shim库可用,它们模仿了功能(以防万一你想支持旧浏览器)
2021-03-24 22:40:05
请注意,filter()仅适用于 Internet Explorer 9+
2021-04-06 22:40:05
如果数组是树结构 ar beforeDeleteOperationArray=[ { "id": 3.1, "name": "test 3.1", "activityDetails": [ { "id": 22, "name": "test 3.1" }, { "id": 23, "name": "changed test 23" } ] } ] 我想删除 id:23
2021-04-09 22:40:05

遍历数组,并splice删除您不想要的数组为了更容易使用,向后迭代,这样您就不必考虑数组的实时性质:

for (var i = myArray.length - 1; i >= 0; --i) {
    if (myArray[i].field == "money") {
        myArray.splice(i,1);
    }
}
数组的实时性质是什么意思?@Neit the Dark Absol
2021-03-10 22:40:05
有点明显,但如果您只希望删除单个唯一元素,您可以在 'if' 语句中插入一个中断以提高性能,这样循环就不会不必要地遍历数组的其余部分。
2021-03-18 22:40:05
@Klors 感谢您的解释。总是像答案一样向后读取数组是否很好?
2021-03-20 22:40:05
@sisimh 他的意思是,如果您通过使用数组的长度作为迭代逻辑的一部分来向前迭代数组,并且由于删除或添加了元素,它的长度会发生变化,您最终可能会跑到数组的末尾或不执行操作数组中的每一项。向后移动的可能性要小得多,因为它适用于静态 0 索引而不是移动长度。
2021-03-21 22:40:05
如果数组是树结构 ar beforeDeleteOperationArray=[ { "id": 3.1, "name": "test 3.1", "activityDetails": [ { "id": 22, "name": "test 3.1" }, { "id": 23, "name": "changed test 23" } ] } ] 我想删除 id:23
2021-03-29 22:40:05

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

使用 ES6 就这么简单。

myArray.splice(myArray.findIndex(item => item.field === "cStatus"), 1)
如果 findIndex 未找到该元素,则返回 -1 并通过 splice 删除最后一个元素,尽管它与谓词不匹配。
2021-03-20 22:40:05
@CompaqLE2202x 2 年后对您来说可能已经很明显了,但对于未来的开发人员:splice更改原始数组,因此您返回的值是已删除的项目,但如果您下次查看myArray该项目将丢失。
2021-04-01 22:40:05
我试过这个,但不是从 OP 的数组中“删除”第三个项目,而是你的代码“过滤”并只显示第三个项目。
2021-04-02 22:40:05

在 ES6 中,只有一行。

const arr = arr.filter(item => item.key !== "some value");

:)

可以使用 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);
}
如果 findIndex(ES6 版本)未找到该元素,则返回 -1 并通过 splice 删除最后一个元素,尽管它与谓词不匹配。
2021-03-14 22:40:05
@Yannic 不错的收获。谢谢你指出。更新了我的答案。
2021-03-17 22:40:05
@forgottofly 树结构?我认为myArray这是一个对象数组。
2021-03-21 22:40:05
什么是数组是树结构?
2021-04-06 22:40:05
如果数组是树结构 var beforeDeleteOperationArray=[ { "id": 3.1, "name": "test 3.1", "activityDetails": [ { "id": 22, "name": "test 3.1" }, { "id": 23, "name": "changed test 23" } ] } ] 我想删除 id:23
2021-04-09 22:40:05