gpt4 book ai didi

javascript - 将一个变量的值设置为相同键的另一个变量

转载 作者:行者123 更新时间:2023-11-28 06:28:17 25 4
gpt4 key购买 nike

我有两个变量 array1array2 如下,我想将 array2 的值放入 array1 > 对于 array1 中存在的属性,其余属性应与默认值保持相同。

我的一个解决方案是迭代数组长度并为找到的属性设置值,但我的数组太长而无法执行迭代(这个问题中提供的数组只是一个原始值)。

除了迭代之外,我需要一些更好的方法。

var array1=[
{
"name": "a",
"value": 0,
"level": [
{
"name": "a1",
"value": 0
},
{
"name": "a2",
"value": 0
}
]
},
{
"name": "b",
"value": 0,
"level": [
{
"name": "b1",
"value": 0
},
{
"name": "b2",
"value": 0
}
]
},
{
"name": "c",
"value": 0,
"level": [
{
"name": "c1",
"value": 0
},
{
"name": "c2",
"value": 0
}
]
}
]



var array2=[
{
"name": "a",
"value": 1,
"level": [
{
"name": "a1",
"value": 1
},
{
"name": "a2",
"value": 0
}
]
},
{
"name": "b",
"value": 1,
"level": [
{
"name": "b1",
"value": 0
},
{
"name": "b2",
"value": 1
}
]
}
]

所需的输出是

var final_array=[
{
"name": "a",
"value": 1,
"level": [
{
"name": "a1",
"value": 1
},
{
"name": "a2",
"value": 0
}
]
},
{
"name": "b",
"value": 1,
"level": [
{
"name": "b1",
"value": 0
},
{
"name": "b2",
"value": 1
}
]
},
{
"name": "c",
"value": 0,
"level": [
{
"name": "c1",
"value": 0
},
{
"name": "c2",
"value": 0
}
]
}
]

最佳答案

具有两个迭代器的递归解决方案,一个用于数组iterateA,一个用于对象iterateO。此提案使用 thisArg 来引用 json2

基本上,两个回调都会迭代项目或键,并检查 this 是否已设置以及实际项目是否存在于 this 中。如果不是,函数返回。

剩下的很简单,如果找到一个对象,那么它会遍历键和对象,如果找到一个数组,它会遍历该数组。

仅在 k === 'value' 的情况下,this[k] 的值才会被分配给 o[k] .

var json1 = [{ "name": "a", "value": 0, "level": [{ "name": "a1", "value": 0 }, { "name": "a2", "value": 0 }] }, { "name": "b", "value": 0, "level": [{ "name": "b1", "value": 0 }, { "name": "b2", "value": 0 }] }, { "name": "c", "value": 0, "level": [{ "name": "c1", "value": 0 }, { "name": "c2", "value": 0 }] }],
json2 = [{ "name": "a", "value": 1, "level": [{ "name": "a1", "value": 1 }, { "name": "a2", "value": 0 }] }, { "name": "b", "value": 1, "level": [{ "name": "b1", "value": 0 }, { "name": "b2", "value": 1 }] }];

function iterateO(o) {
return function (k) {
if (!this || !(k in this)) {
return;
}
if (typeof o[k] === 'object') {
Object.keys(o[k]).forEach(iterateO(o[k]), this[k]);
return;
}
if (Array.isArray(o[k])) {
o[k].forEach(iterateA, this[k]);
return;
}
if (k === 'value') {
o[k] = this[k];
}
};
}

function iterateA(a, i, aa) {
if (!this || !(i in this)) {
return;
}
if (typeof a === 'object') {
Object.keys(a).forEach(iterateO(a), this[i]);
return;
}
if (Array.isArray(a)) {
a.forEach(iterateA, this[i]);
return;
}
}

json1.forEach(iterateA, json2);
document.write('<pre>' + JSON.stringify(json1, 0, 4) + '</pre>');

关于javascript - 将一个变量的值设置为相同键的另一个变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34921173/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com