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

Zak*_*Zak 4 javascript

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

  1. 如果来自inputArray匹配的名称与storedArray名称和年龄相同,则在 中不执行任何操作,storedArray但将该对象保留在 中storedArray。(例如约翰)。
  2. 如果 name from与 nameinputArray匹配storedArray且年龄不同,则仅更新 中旧对象中的年龄值storedArray。(例如简)。
  3. 如果内部有一个新对象,inputArray其名称与任何名称都不匹配storedArray,则将新对象推送到storedArray. (例如莫里斯)。
  4. 必须删除与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},
];
Run Code Online (Sandbox Code Playgroud)

由此

const inputArray = [
        {"name": "Jane", "age": 23, "courses": 0},
        {"name": "John", "age": 25, "courses": 0},
        {"name": "Morris", "age": 18, "courses": 0}
];
Run Code Online (Sandbox Code Playgroud)

对此:

const storedArray = [
        {"name": "John", "age": 25, "courses": 5},
        {"name": "Jane", "age": 23, "courses": 3},
        {"name": "Morris", "age": 18, "courses": 0}
];
Run Code Online (Sandbox Code Playgroud)

我用for of循环尝试了这个,但得到了 22 个结果。其中一些失踪了。此外,我通过将其推入新数组来尝试。SO 中还有其他具有相同标题的帖子,但最终目标与我的目标不符。但我仍然尝试了他们的代码但不起作用。

这是我尝试过的:

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},
];
Run Code Online (Sandbox Code Playgroud)

hev*_*ev1 6

您可以使用Array#reducewithArray#find来查找存储的匹配对象。对于输入数组中的每个元素,我们尝试在存储的数组中找到相应的元素(具有相同的名称)。如果找不到,我们将当前元素推入累加器数组。否则,我们会在推送之前用输入数组元素的年龄更新年龄。

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 res = inputArray.reduce((acc,curr)=>{
    const stored = storedArray.find(({name})=>name===curr.name);
  if(stored){
    stored.age = curr.age;
    acc.push(stored);
  } else {
    acc.push(curr);
  }
  return acc;
}, []);
console.log(res);
Run Code Online (Sandbox Code Playgroud)


You*_*saf 5

不用更新storedArray,只需更新inputArray

映射到inputArray,检查当前对象是否inputArray存在于 中storedArray。如果 中存在storedArray,则更新course当前对象的属性并在每次迭代中返回当前对象。

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}
];

let updatedStoredArr = inputArray.map(a => {
  const exists = storedArray.find(b => a.name == b.name);

  if (exists) {
    a.courses = exists.courses;
  }

  return a;
});

console.log(updatedStoredArr);
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }
Run Code Online (Sandbox Code Playgroud)

您可以使用三元运算符和逗号运算符使代码更加简洁

let updatedStoredArr = inputArray.map(a => {
  const exists = storedArray.find(b => a.name == b.name);
  return exists ? (a.courses = exists.courses, a) : a;
});
Run Code Online (Sandbox Code Playgroud)