Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Javascript中合并树而不编写循环_Javascript_Merge_Tree - Fatal编程技术网

在Javascript中合并树而不编写循环

在Javascript中合并树而不编写循环,javascript,merge,tree,Javascript,Merge,Tree,我有两个数组,它们包含如下所示的单个对象。 我想将这两个结构合并到一个结构中: 更改 定义为以下内容的更改数组: { app_name: "App 1" 2017: {fYear: 2017, changesCount: 37}, 2018: {fYear: 2018, changesCount: 10} } 问题 一系列问题的定义是什么 { app_name: "App 1", 2018: {fYear: 2018, all: 10, typeA: 1, typeB

我有两个数组,它们包含如下所示的单个对象。 我想将这两个结构合并到一个结构中:

更改

定义为以下内容的更改数组:

{ 
  app_name: "App 1"
  2017: {fYear: 2017, changesCount: 37}, 
  2018: {fYear: 2018, changesCount: 10}
}
问题

一系列问题的定义是什么

{ 
  app_name: "App 1",
  2018: {fYear: 2018, all: 10, typeA: 1, typeB:5, TypeC: 1}
}
最终结果

查找合并对象的数组,每个对象都是更改和问题的合并:

{ 
  app_name: "App 1"
  2017: {fYear: 2017, changesCount: 37}, 
  2018: {fYear: 2018, changesCount: 10, all: 10, typeA: 1, typeB:5, TypeC: 1}
}
我当然可以做一个循环,但对我来说似乎不是最好的,所以我一直在尝试研究map&reduce函数,但到目前为止没有运气

有什么建议吗


谢谢大家!

我可以想出一些方法来做到这一点:

let a = {
  app_name: "App 1",
  '2017': { fYear: 2017, changesCount: 37 },
  '2018': { fYear: 2018, changesCount: 10 }
}
let b = {
  app_name: "App 1",
  2018: { fYear: 2018, all: 10, typeA: 1, typeB: 5, TypeC: 1 }
}

let c = { ...a, ...b };
let d = Object.keys(c).reduce((result, item) => {
  if (a[item] && typeof a[item] === 'object') {
    Object.assign(result[item], a[item])
  }
  return result;
}, c);
1) 在一个数组(超集)上使用Map,在另一个数组中使用Find inside查找匹配的元素。一个数组必须是超集,并且两个数组中的app_名称必须是唯一的,才能工作。(如果应用程序名称不唯一,您可以将“查找”更改为“筛选”)

2) 更一般的做法是:创建一个对象映射,其中键为
app\u name
,并从两个数组中增加字段

使用对象映射方法的示例
让更改=[{
应用程序名称:“应用程序1”,
2017: {
财政年度:2017年,
更改日期:37
},
2018: {
财政年度:2018年,
更改日期:10
}
}]
让问题=[{
应用程序名称:“应用程序1”,
2018: {
财政年度:2018年,
全体:10,
A型:1,
B类:5,
C类:1
}
}]
/*
预期结果:
{ 
应用程序名称:“应用程序1”
2017年:{fYear:2017,changesCount:37},
2018年:{fYear:2018,changesCount:10,all:10,typeA:1,typeB:5,TypeC:1}
}*/
函数合并(arr1、arr2){
//保留一个对象以累积关键点
常量acc={};
//帮助器将数组项注册到累加器
函数寄存器映射(数组){
array.forEach(函数(项){
让app_name=item.app_name;
如果(!acc[应用程序名称]){
//此应用程序名称尚未在累加器中
//删除此键以确保我们以后的合并不会对该键进行操作
删除item.app_名称;
acc[应用程序名称]=项目;
返回;
}
//合并传入对象的内部键
Object.key(item).forEach(function(key){
acc[app_name][key]=Object.assign({},acc[app_name][key],item[key])
})
//使用带有适当合并函数的库,上述步骤可能会更容易
//acc[app_name]=\.merge({},项,acc[app_name])
})
}
//将第一个数组元素注册到累加器中
registerToMap(arr1);
//将第二个数组元素注册到累加器中
registerToMap(arr2);
//重建阵列
返回对象。键(acc)。映射(函数(键){
返回Object.assign({},acc[key]{
应用程序名称:密钥
});
})
}

console.log(合并(更改、问题))
我可以想出一些方法来做到这一点:

1) 在一个数组(超集)上使用Map,在另一个数组中使用Find inside查找匹配的元素。一个数组必须是超集,并且两个数组中的app_名称必须是唯一的,才能工作。(如果应用程序名称不唯一,您可以将“查找”更改为“筛选”)

2) 更一般的做法是:创建一个对象映射,其中键为
app\u name
,并从两个数组中增加字段

使用对象映射方法的示例
让更改=[{
应用程序名称:“应用程序1”,
2017: {
财政年度:2017年,
更改日期:37
},
2018: {
财政年度:2018年,
更改日期:10
}
}]
让问题=[{
应用程序名称:“应用程序1”,
2018: {
财政年度:2018年,
全体:10,
A型:1,
B类:5,
C类:1
}
}]
/*
预期结果:
{ 
应用程序名称:“应用程序1”
2017年:{fYear:2017,changesCount:37},
2018年:{fYear:2018,changesCount:10,all:10,typeA:1,typeB:5,TypeC:1}
}*/
函数合并(arr1、arr2){
//保留一个对象以累积关键点
常量acc={};
//帮助器将数组项注册到累加器
函数寄存器映射(数组){
array.forEach(函数(项){
让app_name=item.app_name;
如果(!acc[应用程序名称]){
//此应用程序名称尚未在累加器中
//删除此键以确保我们以后的合并不会对该键进行操作
删除item.app_名称;
acc[应用程序名称]=项目;
返回;
}
//合并传入对象的内部键
Object.key(item).forEach(function(key){
acc[app_name][key]=Object.assign({},acc[app_name][key],item[key])
})
//使用带有适当合并函数的库,上述步骤可能会更容易
//acc[app_name]=\.merge({},项,acc[app_name])
})
}
//将第一个数组元素注册到累加器中
registerToMap(arr1);
//将第二个数组元素注册到累加器中
registerToMap(arr2);
//重建阵列
返回对象。键(acc)。映射(函数(键){
返回Object.assign({},acc[key]{
应用程序名称:密钥
});
})
}

console.log(merge(changes,issues))
查看
Object.keys
在任何情况下都必须在这两个数组上循环—无论是显式使用for循环,还是使用map/reduce的组合(在内部也迭代元素本身)。使用map/reduce的挑战是什么?你能分享你尝试过的代码吗?明白。将循环,但至少不想考虑3的情况下,1)条目中存在的变化,但不是问题,2)进入,在两个,3)进入的问题,但不是在变化是<代码> AppLyNo.<代码>每个数组中唯一的密钥?并且使用外部lib,如
lodash
下划线
,默认情况下提供递归合并函数,这是一个选项吗?实际上,如果您检查
Array.prototype.map()的polyfill,你仍然可以在里面找到一个while循环。看看
Object.keys
在任何情况下你都必须在这两个数组上循环-无论你是显式地使用for循环还是map/reduce的组合(它也在元素本身上进行内部迭代)。使用map/reduce的挑战是什么?你会唱歌吗