Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中从对象数组中删除的有效方法_Javascript - Fatal编程技术网

在JavaScript中从对象数组中删除的有效方法

在JavaScript中从对象数组中删除的有效方法,javascript,Javascript,我正在尝试删除frontendtask中id=1的条目,并使用此代码从backendtask推送该条目 frontendtasks = [ {"id": 1, "name": "User Deletion", "script": "UserDeletion"}, {"id": 2, "name&quo

我正在尝试删除frontendtask中id=1的条目,并使用此代码从backendtask推送该条目

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));