在JavaScript中从对象数组中删除的有效方法
我正在尝试删除frontendtask中id=1的条目,并使用此代码从backendtask推送该条目在JavaScript中从对象数组中删除的有效方法,javascript,Javascript,我正在尝试删除frontendtask中id=1的条目,并使用此代码从backendtask推送该条目 frontendtasks = [ {"id": 1, "name": "User Deletion", "script": "UserDeletion"}, {"id": 2, "name&quo
frontendtasks = [
{"id": 1, "name": "User Deletion", "script": "UserDeletion"},
{"id": 2, "name": "User Creation", "script_name": "UserCreation"}
]
backendtasks = [
{"id": 1, "name": "User Deletion", "script": "UserDeletion_V2"}
]
这是真的很慢,CPU命中率100%,在浏览器中有700项。有什么有效的方法来实现这一点吗?不要在两个数组中循环,而是使用对象将后端ID映射到值:
const映射={};
for(后端任务的常量任务){
映射[task.id]=任务;
}
for(设i=0;i
通过删除嵌套的for
循环,创建映射表将时间复杂度从O(n^2)降低到O(n)
请尝试以下代码:
if (backendtasks != 0) {
for (updated_task in backendtasks ) {
for (oldtask in frontendtasks) {
if (frontendtasks[oldtask].id == backendtasks[updated_task].id) {
frontendtasks[oldtask] = backendtasks[updated_task]
delete backendtasks[updated_task];
break;
}
}
}
for (new_task in backendtasks) {
frontendtasks.unshift(backendtasks[new_task])
}
}
不知何故,我没有在任何创建新数组的解决方案中看到map()
函数,如下所示。
这将返回带有新值的新数组。如您所见,它需要一个数组、一个id(可以是任何类型的tho)和一个回调
搜索数组中的id
,并在找到时运行回调。为你想做的事提供有效的方法
在回调中,我在backendtasks
上使用了find()
找到后,它从backendtasks
返回项目,然后通过在map()函数中返回该值来完成该函数
因此,这应该是O(n),考虑到回调只运行一次,在我看来,这是一个更优雅的解决方案,可以用于多种用途
const map = {};
backendtasks.forEach(bt => (map[bt.id] = bt));
frontendtasks.forEach((ft, idx) => {
if (map[ft.id]) {
frontendtasks[idx] = map[ft.id];
delete map[ft.id];
}
});
frontendtasks = frontendtasks.concat(Object.values(map));
方法:由于您有2个数组,我建议首先将后端数组规范化为一个对象,然后在前端数组上迭代并在规范化对象中查找,因为对象中的查找是O(1),而数组中的查找是O(n)
函数getFrontendTasks(){
常量前端任务=[
{“id”:1,“名称”:“用户删除”,“脚本”:“用户删除”},
{“id”:2,“name”:“User Creation”,“script_name”:“UserCreation”}
]
常量后端任务=[
{“id”:1,“name”:“User Deletion”,“script”:“UserDeletion_V2”}
]
const normalizedBackendTasks=backendtasks.reduce((acc,val)=>({…acc,[val.id]:val}),{});
const newFrontendTasks=frontendtasks.map((task)=>normalizedBackendTasks[task.id]| | task);
返回新的前端任务
}
console.log(getFrontendTasks())
注意,对数组使用delete
是一种不好的做法,因为它不会更改数组的长度,而是在该索引处保留未定义的
,就像@charlietfl所说的那样!
const frontendtasks: any[] = [];
const backendtasks: any[] = [];
const fn = (arr: any[], id: number, callback: (removed: any) => any) => {
return arr.map((ft) => {
if (ft.id !== id) return ft;
else return callback(ft);
});
};
fn(frontendtasks, 1, (rm) => backendtasks.find((id) => rm.id === id));