Javascript 无法用另一个对象数组更新对象数组

Javascript 无法用另一个对象数组更新对象数组,javascript,Javascript,我有两个不同的对象数组,storedArray存储在我的文件系统中,inputArray由用户输入更新storedArray。每个数组的最小长度为1,最大数没有上限。此外,它们不一定必须具有相同的长度。所以我想要的是在每个数组上循环,并且: 如果inputArray中的名称与storedArray名称和年龄匹配,则在storedArray中不执行任何操作,而是将该对象保留在storedArray中。(例如约翰) 如果inputArray中的名称与storedArray名称和年龄不匹配,则只更新s

我有两个不同的对象数组,
storedArray
存储在我的文件系统中,
inputArray
由用户输入更新
storedArray
。每个数组的最小长度为1,最大数没有上限。此外,它们不一定必须具有相同的长度。所以我想要的是在每个数组上循环,并且:

  • 如果
    inputArray
    中的名称与
    storedArray
    名称和年龄匹配,则在
    storedArray
    中不执行任何操作,而是将该对象保留在
    storedArray
    中。(例如约翰)
  • 如果
    inputArray
    中的名称与
    storedArray
    名称和年龄不匹配,则只更新
    storedArray
    中旧对象中的年龄值。(例如简)
  • 如果
    inputArray
    中有一个新对象的名称与
    storedArray
    中的任何名称不匹配,则将该新对象推送到
    storedArray
    。(例如莫里斯)
  • 必须删除
    storedArray
    中与
    inputArray
    不匹配的其他对象。(例如乔安娜、吉姆)
  • 更新此

    const storedArray = [
            {"name": "John", "age": 25, "courses": 5},
            {"name": "Jane", "age": 21, "courses": 3},
            {"name": "Joanna", "age": 19, "courses": 2},
            {"name": "Jim", "age": 20, "courses": 4},
    ];
    
    由此

    const inputArray = [
            {"name": "Jane", "age": 23, "courses": 0},
            {"name": "John", "age": 25, "courses": 0},
            {"name": "Morris", "age": 18, "courses": 0}
    ];
    
    为此:

    const storedArray = [
            {"name": "John", "age": 25, "courses": 5},
            {"name": "Jane", "age": 23, "courses": 3},
            {"name": "Morris", "age": 18, "courses": 0}
    ];
    
    我尝试了
    for of
    循环,但得到了22个结果。有些人失踪了。此外,我还尝试将其放入一个新阵列中。这里还有其他帖子,所以标题相同,但最终目标与我的不匹配。但我还是尝试了他们的代码,但没有成功

    以下是我尝试过的:

    const storedArray=[
    {“姓名”:“约翰”,“年龄”:25,“课程”:5},
    {“姓名”:“简”,“年龄”:21,“课程”:3},
    {“姓名”:“乔安娜”,“年龄”:19,“课程”:2},
    {“姓名”:“吉姆”,“年龄”:20,“课程”:4}
    ];
    常量输入数组=[
    {“姓名”:“简”,“年龄”:23,“课程”:0},
    {“姓名”:“约翰”,“年龄”:25,“课程”:0},
    {“姓名”:“莫里斯”,“年龄”:18,“课程”:0}
    ];
    设newArray=[];
    对于(让storedArray的项目){
    for(让每个inputArray){
    if(item.name==each.name&&item.age==each.age){
    newArray.push(项目);
    }else if(item.name==each.name&&item.age!==each.age){
    item.age=每个.age;
    newArray.push(项目);
    }else if(item.name!==each.name){
    newArray.push(每个);
    newArray.push(项目);
    }
    }
    }
    log(newArray)您可以与一起使用来查找存储的匹配对象。对于输入数组中的每个元素,我们尝试在存储的数组中找到对应的元素(具有相同的名称)。如果找不到,我们将当前元素推送到累加器数组。否则,在推送输入数组元素之前,我们将使用输入数组元素中的年龄更新年龄

    const storedArray=[
    {“姓名”:“约翰”,“年龄”:25,“课程”:5},
    {“姓名”:“简”,“年龄”:21,“课程”:3},
    {“姓名”:“乔安娜”,“年龄”:19,“课程”:2},
    {“姓名”:“吉姆”,“年龄”:20,“课程”:4},
    ];
    常量输入数组=[
    {“姓名”:“简”,“年龄”:23,“课程”:0},
    {“姓名”:“约翰”,“年龄”:25,“课程”:0},
    {“姓名”:“莫里斯”,“年龄”:18,“课程”:0}
    ];
    const res=输入阵列。reduce((acc,curr)=>{
    const stored=storedArray.find(({name})=>name==curr.name);
    如果(存储){
    存储时间=当前时间;
    acc.push(存储);
    }否则{
    加速推力(电流);
    }
    返回acc;
    }, []);
    
    控制台日志(res)
    只需更新
    输入阵列,而不是更新
    存储阵列

    映射到
    输入阵列
    ,检查
    输入阵列
    中的当前对象是否存在于
    存储阵列
    中。如果它存在于
    storedArray
    中,则更新当前对象的
    课程
    属性,并在每次迭代中返回当前对象

    const storedArray=[
    {“姓名”:“约翰”,“年龄”:25,“课程”:5},
    {“姓名”:“简”,“年龄”:21,“课程”:3},
    {“姓名”:“乔安娜”,“年龄”:19,“课程”:2},
    {“姓名”:“吉姆”,“年龄”:20,“课程”:4},
    ];
    常量输入数组=[
    {“姓名”:“简”,“年龄”:23,“课程”:0},
    {“姓名”:“约翰”,“年龄”:25,“课程”:0},
    {“姓名”:“莫里斯”,“年龄”:18,“课程”:0}
    ];
    让updatedStoredArr=inputArray.map(a=>{
    const exists=storedArray.find(b=>a.name==b.name);
    如果(存在){
    a、 courses=exists.courses;
    }
    返回a;
    });
    console.log(updatedstoredar)
    
    .as console wrapper{max height:100%!important;top:0;}
    考虑到规则集导致
    新数组
    成为
    输入数组
    ,其中项目
    课程
    为相应项目获取
    storedArray
    中已有的值,实现你想要的目标的一个艰难的方法应该是:

    让newArray=inputArray.slice();
    对于(var i=newArray.length-1;i>=0;i--){
    用于(让storedArray存储){
    if(stored.name==newArray[i].name){
    newArray[i].courses=stored.courses;
    }
    }
    }
    

    [编辑]:简练版本的@Yousaf是一个不错的选择。

    既然您想从存储数组中删除输入数组中不存在的所有对象,为什么不直接用输入数组替换存储数组呢?因为storedArray中的
    courses
    属性。他们有我无法改变的价值观。如果我替换它,那么匹配的对象会使所有课程的值都变为0。嘿,为什么在.find()中使用{name}作为参数?另外,你能简单解释一下你在那里做了什么吗?@Zak它的对象分解:@Zak我添加了一个解释。