我有一个对象数组(objList),每个对象都具有“ id”属性。
我有一个字符串数组(idsToRemove),表示要从objList中删除的对象的ID。
我找到了一些解决方案,但我担心它很慢,尤其是对于具有许多属性的大量对象而言。 有更有效的方法吗?
var idsToRemove = ["3", "1"];
var objList = [{
id: "1",
name: "aaa"
},
{
id: "2",
name: "bbb"
},
{
id: "3",
name: "ccc"
}
];
for (var i = 0, len = idsToRemove.length; i < len; i++) {
objList = objList.filter(o => o.id != idsToRemove[i]);
}
console.log(objList);
答案 0 :(得分:35)
将 namespace App\Http\Controllers; use App\Employee;
use Illuminate\Http\Request; class EmployeeController extends Controller
{
转换为idsToRemove
,以便可以使用Set
(一项Set.prototype.has
操作)和O(1)
.filter
一次,因此总体复杂度为objList
(并且您仅对可能巨大的O(n)
进行了一次迭代):
objList
请注意,var idsToRemove = ["3", "1"];
var objList = [{
id: "1",
name: "aaa"
},
{
id: "2",
name: "bbb"
},
{
id: "3",
name: "ccc"
}
];
const set = new Set(idsToRemove);
const filtered = objList.filter(({ id }) => !set.has(id));
console.log(filtered);
和Array.prototype.includes
操作是Array.prototype.indexOf
,而不是O(N)
,因此,如果使用它们代替O(1)
,它们可能会花费更长的时间
答案 1 :(得分:4)
您可以使用Array.includes
来检查给定的字符串是否存在于给定的数组中,并将其与Array.filter
组合。
const idsToRemove = ['3', '1'];
const objList = [{
id: '1',
name: 'aaa',
},
{
id: '2',
name: 'bbb',
},
{
id: '3',
name: 'ccc',
},
];
const filteredObjList = objList.filter(x => !idsToRemove.includes(x.id));
console.log(filteredObjList);
答案 2 :(得分:3)
如果使用内置的查找功能,则不需要两个嵌套的迭代器
objList = objList.filter(o => idsToRemove.indexOf(o.id) < 0);
文档:
答案 3 :(得分:1)
只需使用Array.filter()
const idsToRemove = ['3', '1'];
const objList = [{
id: '1',
name: 'aaa',
},
{
id: '2',
name: 'bbb',
},
{
id: '3',
name: 'ccc',
}
];
const res = objList.filter(value => !idsToRemove.includes(value.id));
console.log("result",res);