我有两个不同的对象数组,storedArray存储在我的文件系统中,并由inputArray用户输入的 update 组成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},
];
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)
您可以使用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)
不用更新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)