将较小的数组(具有键值对的对象元素)组合成较大的数组
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
有额外的属性,它们也会被添加。
我有两个数组(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
有额外的属性,它们也会被添加。