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我添加了一个解释。