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

时间:2016-01-21 10:29:16

标签: javascript angularjs

我有两个变量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
            }
        ]
    }
]

1 个答案:

答案 0 :(得分: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>');