将较小的数组(具有键值对的对象元素)组合成较大的数组

combining a smaller array (with object elements having key-value pairs) into a larger array

我有两个数组(initialArray 和 updatedArray),都有 18 个元素。

initialArray 中的每个元素都是一个具有 5 个键值对的对象。

初始数组:

[0]
   head: 'hi',
   a: '',
   b: '',
   c: '',
   d: ''
[1]
   head: 'yo',
   a: '',
   b: 'old',
   c: '',
   d: ''
.
.
.

updatedArray 与 initialArray 类似,但是: 1)它不会拥有所有 5 个键值(仅在 2 到 3 之间,包括头部)。 2) initialArray 有空白或旧值,而 updatedArray 将为 new/populated) 3)元素的顺序不同 例如

更新数组:

[0]
   head:'yo',
   b: 'bb',
   d: 'dd'
[1]
   head:'hi',
   b: 'bb',
   a: 'aa'
.
.
.

有人可以提供一些关于用 updatedArray 中的键值覆盖 initialArray 的建议(使用 'head' 键来匹配数组之间的元素)。头键永远不会更新,但其他键值会更新。

我会在需要时多次 运行,所以我不能假设 initialArray 总是有空白值。如果空白值没有被覆盖,那么它们将保留在如下结果中:

组合数组:

[0]
   head: 'hi',
   a: 'aa',
   b: 'bb',
   c: '',
   d: ''
[1]
   head: 'yo',
   a: '',
   b: 'bb',
   c: '',
   d: 'dd'
.
.
.

有什么建议吗?我目前的尝试是尝试用 3 个 for 循环做一些事情:

    for (var k in updatedArray){
        for (var kk in initialArray){
            if(updatedArray[k].head ==initialArray[kk].head){
                for (var kkk in updatedArray[k][kk]){
                    initialArray[k][kk][kkk] = updatedArray[k][kk][kkk];
                }
            }

        }
    }

在这种情况下,k是索引(0,1),kk是键(head,a,b,etc),kkk是键的值value.although这好像不是工作

这就是您所需要的。您尝试访问第三个循环中的属性的方式不正确。请参阅下面的代码。

var initarray = [{
  head: 'hi',
  a: '',
  b: '',
  c: '',
  d: ''
}, {
  head: 'yo',
  a: '',
  b: 'old',
  c: '',
  d: ''
}]

var updatedarray = [{
  head: 'yo',
  b: 'bb',
  d: 'dd'
}, {
  head: 'hi',
  b: 'bb',
  a: 'aa'
}]

for (var k in updatedarray) {
  for (var kk in initarray) {
    if (updatedarray[k].head == initarray[kk].head) {
      for (var kkk in updatedarray[k]) {
        initarray[kk][kkk] = updatedarray[k][kkk];
      }
    }

  }
}

console.log(JSON.stringify(initarray));
//console.log(initarray);

希望对您有所帮助:)

编辑:我对以前的代码进行了改进。这是我能想到的最简单的解决方案(为此使用 Object.assign):

updatedArray.forEach(function(update){ 
  var initial = initialArray.find(x => x.head === update.head); 
  Object.assign(initial, update);
});

请记住,如果 updateArray 有额外的属性,它们也会被添加。