Javascript 按条件合并对象数组

Javascript 按条件合并对象数组,javascript,arrays,Javascript,Arrays,假设我有一个对象数组-原始项 originalItems = [ {name:"aaa", expanded: false, visible: true}, {name:"bbb", expanded: false, visible: true}, {name:"ccc", expanded: false, visible: true} ] 然后我对项目进行一些更改 currentItems = [ {name

假设我有一个对象数组-原始项

originalItems = [
   {name:"aaa", expanded: false, visible: true},
   {name:"bbb", expanded: false, visible: true},
   {name:"ccc", expanded: false, visible: true}
]
然后我对项目进行一些更改

currentItems = [
   {name:"aaa", expanded: true, visible: false},
   {name:"bbb", expanded: false, visible: true},
   {name:"ccc", expanded: true, visible: true}
]
现在我需要合并这两个数组

但是:在合并数组(结果)中,我需要扩展的值将来自currentItems,而可见值将来自originalItems 像这样的

result = [
   {name:"aaa", expanded: true, visible: true},
   {name:"bbb", expanded: false, visible: true},
   {name:"ccc", expanded: true, visible: true}
]
有什么优雅的方法可以实现吗?或者只查看属性?

您可以在其中一个数组上使用,例如原始数组,并通过将原始对象()的属性扩展到新对象中,将每个对象转换为新对象。然后,您可以通过索引(
i
)将
expanded
属性设置为从
currentItems
中相应的对象获取值。见下例:
const originalItems=[{name:“aaa”,展开:false,visible:true},{name:“bbb”,展开:false,visible:true},{name:“ccc”,展开:false,visible:true}];
const currentItems=[{name:“aaa”,展开:真,可见:假},{name:“bbb”,展开:假,可见:真},{name:“ccc”,展开:真,可见:真}];
const res=originalItems.map((obj,i)=>({
…obj,
已展开:currentItems[i]。已展开
}));
控制台日志(res)您可以在其中一个数组(例如原始数组)上使用,并通过将原始对象()的属性扩展到新对象中,将每个对象转换为新对象。然后,您可以通过索引(
i
)将
expanded
属性设置为从
currentItems
中相应的对象获取值。见下例:
const originalItems=[{name:“aaa”,展开:false,visible:true},{name:“bbb”,展开:false,visible:true},{name:“ccc”,展开:false,visible:true}];
const currentItems=[{name:“aaa”,展开:真,可见:假},{name:“bbb”,展开:假,可见:真},{name:“ccc”,展开:真,可见:真}];
const res=originalItems.map((obj,i)=>({
…obj,
已展开:currentItems[i]。已展开
}));

控制台日志(res)由于要从两个相同长度的不同数组中获取元素以创建第三个数组,因此可以创建一个新数组,然后循环数组中的对象数,根据所需的源列表构建结果对象

let result = [];
for (i = 0; i < originalItems.length; i++) {
  let newObj = {
    name: originalItems[i].name,
    expanded: currentItems[i].expanded,
    visible: originalItems[i].visible,
  };
  result.push(newObj);
}
let result=[];
对于(i=0;i
由于要从两个相同长度的不同数组中获取元素以创建第三个数组,因此可以创建一个新数组,然后循环数组中的对象数,根据所需的源列表构建结果对象

let result = [];
for (i = 0; i < originalItems.length; i++) {
  let newObj = {
    name: originalItems[i].name,
    expanded: currentItems[i].expanded,
    visible: originalItems[i].visible,
  };
  result.push(newObj);
}
let result=[];
对于(i=0;i
为了简单和快速,我会像这样对阵列进行排序和管理。也许比你想做的更多。

let项目=[
{name:“aaa”,展开:false,可见:true},
{name:“bbb”,展开:false,可见:true},
{name:“ccc”,展开:false,可见:true}
]
函数doExpand(名称,val){
let item=getItem(名称);
item.expanded=val;
}
函数doVisible(名称,val){
let item=getItem(名称);
item.visible=val;
}
函数附加项(名称){
如果(!getItem(名称)){
push({name:name,expanded:false,visible:false});
}否则{
console.log(“发现重复项”);
}
}
函数getItem(名称){
for(设i=0;i控制台日志(项目)为了简单和快速,我会像这样对数组进行排序和管理。也许比你想做的更多。

let项目=[
{name:“aaa”,展开:false,可见:true},
{name:“bbb”,展开:false,可见:true},
{name:“ccc”,展开:false,可见:true}
]
函数doExpand(名称,val){
let item=getItem(名称);
item.expanded=val;
}
函数doVisible(名称,val){
let item=getItem(名称);
item.visible=val;
}
函数附加项(名称){
如果(!getItem(名称)){
push({name:name,expanded:false,visible:false});
}否则{
console.log(“发现重复项”);
}
}
函数getItem(名称){
for(设i=0;i控制台日志(项目)
currentItems
的顺序是否与
originalItems
相同?是的,它的顺序是否与
currentItems
的顺序相同?是的,它的顺序相同,比Map快;如果目标是有效的,作为一个提防。For比Map快;如果目标是有效的,作为一个领导者。