通过与另一个数组javascript匹配来覆盖数组元素值

Override an array element value by matching with another array javascript

本文关键字:覆盖 数组元素 javascript 另一个 数组      更新时间:2023-09-26

array1具有带子级的父级。array2中几乎没有父母的其他子女。array1子项应替换为array2 中的子项

阵列1:

 {
    "name": "USA",
    "id": "country: USA",
    "children": [
        {
            "name": "chicago",
            "id": "country:USA>chicago"
        },
        {
            "name": "arizona",
            "id": "country:USA>arizona"
        },
        {
            "name": "alabama",
            "id": "country:USA>alabama"
        }
    ]
},
    {
        "name": "xyz",
        "id": "country:xyz",
        "children": [
            {
                "name": "name1",
                "id": "country:xyz>name1"
            },
            {
                "name": "name2",
                "id": "country:xyz>name2"
            }
        ]
    },
    {
        "name": "abc",
        "id": "country:abc",
        "children": [
            {
                "name": "name1",
                "id": "country:abc>abc1"
            },
            {
                "name": "name2",
                "id": "country:abc>abc2"
            }
        ]
    }

阵列2:

[
{
    "name": "name3",
    "id": "country:xyz>name1"
},
{
    "name": "georgia",
    "id": "country:USA>georgia"
},
{
    "name": "name4",
    "id": "country:xyz>name4"
}

]

结果:

[
{
    "name": "USA",
    "id": "country:USA",
    "children": [
        {
            "name": "georgia",
            "id": "country:USA>georgia"
        }
    ]
},
{
    "name": "xyz",
    "id": "country:xyz",
    "children": [
        {
            "name": "name3",
            "id": "country:xyz>name1"
        },
        {
            "name": "name4",
            "id": "country:xyz>name4"
        }
    ]
},
{
    "name": "abc",
    "id": "country:abc",
    "children": [
        {
            "name": "name1",
            "id": "country:abc>abc1"
        },
        {
            "name": "name2",
            "id": "country:abc>abc2"
        }
    ]
}

]

我尝试过但没有成功的代码。我的代码的问题是我按原样返回array1,而我希望array2在array1中找到它的父级。一旦找到父级,就应该用array2的数据替换array1的子级。

for (var j = 0; j < array2.length; j++) {
var parentId = array2[j].id.substr(0, array2[j].id.indexOf('>'));
for(var k=0; k < array1.length; k++){
    if( parentId == array1[k].id){
        if(array2[j].id.indexOf(array1[k].children.id) > -1){ //found a match
            array1[k].children = [];
            array1[k].children.push(array2[j]);
        }
    }
}

}

我建议为分组项构建一个带有键的临时对象,然后在array1上迭代,如果属性idtemp对象中,则用新内容替换children属性的内容。

var array1 = [{ "name": "USA", "id": "country:USA", "children": [{ "name": "chicago", "id": "country:USA>chicago" }, { "name": "arizona", "id": "country:USA>arizona" }, { "name": "alabama", "id": "country:USA>alabama" }] }, { "name": "xyz", "id": "country:xyz", "children": [{ "name": "name1", "id": "country:xyz>name1" }, { "name": "name2", "id": "country:xyz>name2" }] }, { "name": "abc", "id": "country:abc", "children": [{ "name": "name1", "id": "country:abc>abc1" }, { "name": "name2", "id": "country:abc>abc2" }] }],
    array2 = [{ "name": "name3", "id": "country:xyz>name1" }, { "name": "georgia", "id": "country:USA>georgia" }, { "name": "name4", "id": "country:xyz>name4" }];
function f() {
    var temp = {};
    array2.forEach(function (a) {
        var key = /(country:.*)>/i.exec(a.id)[1];
        temp[key] = temp[key] || [];
        temp[key].push(a);
    });
    array1.forEach(function (a) {
        if (a.id in temp) {
            a.children = temp[a.id];
        }
    });
}
f();
document.write('<pre>' + JSON.stringify(array1, 0, 4) + '</pre>');