Javascript 如何使用唯一键将两个或多个对象数组合并到一个数组中

Javascript 如何使用唯一键将两个或多个对象数组合并到一个数组中,javascript,ecmascript-6,Javascript,Ecmascript 6,我需要创建一个数组的基础上,两个和更多的其他数组具有唯一的键数组中的每个元素 键的名称应递增 此数据用于通过Recharts打印 但下面的代码是不正确的,我得到了每个键相同的值 你们可以看到演示 我有一个数组: const setOfArrays = [ [ { 'dateTime': 1531612800000, 'value': 97.0, 'rangeMin': 79.0, 'rangeMax': 110.0 }, { 'dateTime'

我需要创建一个数组的基础上,两个和更多的其他数组具有唯一的键数组中的每个元素 键的名称应递增 此数据用于通过Recharts打印 但下面的代码是不正确的,我得到了每个键相同的值

你们可以看到演示

我有一个数组:

const setOfArrays = [
[
{
     'dateTime': 1531612800000,
     'value': 97.0,
     'rangeMin': 79.0,
     'rangeMax': 110.0
},
{
     'dateTime': 1531512800000,
     'value': 96.0,
     'rangeMin': 79.0,
     'rangeMax': 110.0
}],
[{

      'dateTime': 1544745600000,
      'value': 82.7,
      'goal': 77.0

},{

      'dateTime': 1544745600000,
      'value': 81,
      'goal': 77.0

}],
[{
     'dateTime': 1531612800000,
     'value': 66.0,
     'rangeMin': 50.0,
     'rangeMax': 80.0
},{
     'dateTime': 1531612800000,
     'value': 65.0,
     'rangeMin': 50.0,
     'rangeMax': 80.0
}]
]
我期望从输出中得到什么

[
{
     'dateTime': 1531612800000,
     'value': 97.0,
     'rangeMin': 79.0,
     'rangeMax': 110.0,

     'dateTime1': 1544745600000,
     'value1': 82.7,
     'goal1': 77.0,

     'dateTime2': 1531612800000,
     'value2': 66.0,
     'rangeMin2': 50.0,
     'rangeMax2': 80.0

},
{
     'dateTime': 1531512800000,
     'value': 96.0,
     'rangeMin': 79.0,
     'rangeMax': 110.0,

      'dateTime1': 1544745600000,
      'value1': 81,
      'goal1': 77.0,

     'dateTime2': 1531612800000,
     'value2': 65.0,
     'rangeMin2': 50.0,
     'rangeMax2': 80.0
}
]
我写的代码不正确,值重复,我不知道哪里出了问题

其思想是创建一个对象,其中key作为嵌套数组索引,value作为结果数组中的对象。然后使用Object.values获取结果数组。 因此,要从给定数组创建对象,我们将使用array.reduce,其中对于数组中的每个项,我们将执行以下操作 迭代item objects数组,检查给定索引的简化对象中是否存在对象 如果找不到条目,请在对象中添加值为object{…o}的条目 否则,如果找到条目,则对于每个键,项对象中的值,更新相应的对象 注意-由于结果对象应该是嵌套数组的长度,我们知道结果对象中的键数将与任何一个嵌套数组的长度相同。这就是为什么在[i]中,i是嵌套数组的索引。对于这些值,我们知道第一个数组中的第一个对象将按原样出现,其他对象将以数组索引j作为后缀。因此,我们检查了是否存在与中的索引相对应的对象,因为对于第一个数组对象,它始终是未定义的,因此,我们将在结果对象中添加key:value。对于其他人,我们只需要使用父迭代器j循环和后缀,比如${k}${j}

const setofarray=[{'dateTime':1531612800000,'value':97.0,'rangeMin':79.0,'rangeMax':110.0},{'dateTime':1531512800000,'value':96.0,'rangeMin':79.0,'rangeMax':110.0},{'dateTime':154474560000,'value':82.7,'goal':77.0},{'dateTime':154474560000,'value':81,'goal':77.0},{'dateTime':1612800000,'value':66.0,'rangeMin,',{'dateTime':1531612800000,'value':65.0,'rangeMin':50.0,'rangeMax':80.0}]; const result=Object.valuessetOfArrays.reducea,c,j=>{ c、 forEacho,i=>{ ifa[i]Object.entrieso.forEach[k,v]=>Object.assigna[i],{[`k}${j}`]:v}; 否则a[i]={……o}; }; 返回a; }, {}; console.logresult;使用、、&

其思想是创建一个对象,其中key作为嵌套数组索引,value作为结果数组中的对象,然后使用object.values获得结果数组。 因此,要从给定数组创建对象,我们将使用array.reduce,其中对于数组中的每个项,我们将执行以下操作 迭代item objects数组,检查给定索引的简化对象中是否存在对象 如果找不到条目,请在对象中添加值为object{…o}的条目 否则,如果找到条目,则对于每个键,项对象中的值,更新相应的对象 注意-由于结果对象应该是嵌套数组的长度,我们知道结果对象中的键数将与任何一个嵌套数组的长度相同,i是嵌套数组的索引。对于值,我们知道第一个数组中的第一个对象将按原样出现,其他对象将以数组索引j作为后缀。因此,我们检查了是否存在与a中的索引相对应的对象,因为对于第一个数组对象,它将始终未定义,因此,我们将在r中添加键:value对于其他对象,我们只需要使用父迭代器j循环和后缀,比如${k}${j}

const setofarray=[{'dateTime':1531612800000,'value':97.0,'rangeMin':79.0,'rangeMax':110.0},{'dateTime':1531512800000,'value':96.0,'rangeMin':79.0,'rangeMax':110.0},{'dateTime':154474560000,'value':82.7,'goal':77.0},{'dateTime':154474560000,'value':81,'goal':77.0},{'dateTime':1612800000,'value':66.0,'rangeMin,',{'dateTime':1531612800000,'value':65.0,'rangeMin':50.0,'rangeMax':80.0}]; const result=Object.valuessetOfArrays.reducea,c,j=>{ c、 forEacho,i=>{ ifa[i]Object.entrieso.forEach[k,v]=>Object.assigna[i],{[`k}${j}`]:v}; 否则a[i]={……o}; }; 返回a; }, {};
logresult;从您的输出中,您正在将mxn矩阵合并到一个n项的列式数组中

所以

映射到其中一个内部数组。 在里面,绘制一组阵列的地图 使用从每行获取当前列的条目数组。用于展平返回到一个数组的数组。 当矩阵项的行号非零时,为每个键添加后缀。 使用从合并的条目创建对象 const SetOfArray=[{'dateTime':1531612800000,'value':97.0,'rangeMin':79.0,'rangeMax':110.0},{'dateTime':1531512800000,'value':96.0,'rangeMin':79.0,'rangeMax':110.0},{'dateTime':154474560000,'value':82.7,'goal':77.0},{'dateTime':154474560000,'value':81,'go al':77.0}],{'dateTime':1531612800000,'value':66.0,'rangeMin':50.0,'rangeMax':80.0},{'dateTime':1531612800000,'value':65.0,'rangeMin':50.0,'rangeMax':80.0}]; 常量输出=数组集合[0]。mapobj,i=>{ const entries=setofarray.flatMaparr,j=>{ const suffix=j | |//为非零j添加索引后缀 return Object.entriesarr[i].map[k,v]=>[k+后缀,v]; } 返回Object.fromEntriesentries }
logoutput从您的输出中,您正在将mxn矩阵合并到一个n项的数组中

所以

映射到其中一个内部数组。 在里面,绘制一组阵列的地图 使用从每行获取当前列的条目数组。用于展平返回到一个阵列的阵列。 当矩阵项的行号非零时,为每个键添加后缀。 使用从合并的条目创建对象 const setofarray=[{'dateTime':1531612800000,'value':97.0,'rangeMin':79.0,'rangeMax':110.0},{'dateTime':1531512800000,'value':96.0,'rangeMin':79.0,'rangeMax':110.0},{'dateTime':154474560000,'value':82.7,'goal':77.0},{'dateTime':154474560000,'value':81,'goal':77.0},{'dateTime':1612800000,'value':66.0,'rangeMin,',{'dateTime':1531612800000,'value':65.0,'rangeMin':50.0,'rangeMax':80.0}]; 常量输出=数组集合[0]。mapobj,i=>{ const entries=setofarray.flatMaparr,j=>{ const suffix=j | |//为非零j添加索引后缀 return Object.entriesarr[i].map[k,v]=>[k+后缀,v]; } 返回Object.fromEntriesentries }
console.logoutput您的代码应该在您的问题中,并且应该根据您在该小提琴上的代码进行压缩。合并[{a:1},{a:2}]的输出应该是[{a:[1,2]}]而不是[{a:1,a2:2}]?那会更容易使用。你的代码应该在你的问题中,并且应该从你在小提琴上拥有的东西中浓缩出来。合并[{a:1},{a:2}]的输出应该是[{a:[1,2]}]而不是[{a:1,a2:2}]?那会更容易使用。一个解释会更好。我正在试图弄清楚你什么时候决定需要一个新对象。我想我不明白OP在问什么,感觉输出将是一个具有一堆属性的单个对象,我一定是丢失了something@JuanMendes他们正试图合并来自al的每个索引l将内部数组设置为1object@adiga但是输出是两个对象?是的。所以OP有一个3个数组的数组,每个数组的长度为2,并且想要转换为一个长度为2的数组,其中想要将所有3个数组的每个索引处的对象合并为1,这样解释就更好了。我正在试着弄清楚什么时候需要一个新对象。我想我不需要“我不明白OP在问什么,它感觉输出将是一个具有一堆属性的单个对象,我一定是缺少了something@JuanMendes他们正试图将所有内部数组中的每个索引合并为一个索引object@adiga但是输出是两个对象?是的。所以OP有一个由3个数组组成的数组,每个数组的长度为2,并且希望转换为长度为2的数组,其中要将所有3个数组的每个索引处的对象合并为1Ha…此答案有意义,而且非常优雅。@shuts13这看起来像您正在寻找的。Ha…此答案有意义,并且非常优雅。@shuts13这看起来像您正在寻找的。