簡體   English   中英

使用forEach動態創建嵌套對象

[英]Create nested object dynamically with forEach

我有一個'path'字符串: 'profile.name.en' ;

我想用它動態創建一個對象。 我正在使用此功能及其工作:

function set(obj, path, value) {
    var schema = obj;  // a moving reference to internal objects within obj
    var arr = path.split('.');
    var len = arr.length;

    for(var i = 0; i < len-1; i++) {
        var elem = arr[i];
        if( !schema[elem] ) schema[elem] = {};
        schema = schema[elem];
    }
    schema[arr[len-1]] = value;
    return schema;
}

像這樣使用它:

var a = {};
var path = 'profile.name.en';
var profileName = 'OleFrank';
var o = set(a, path, profileName);

// result
{
    profile: {
        name: {
            en: 'OleFrank'
        }
    }
}

我試圖重構為使用forEach而不是for循環,但是后來它不再起作用了。 為什么是這樣??

您可以使用Array#reduce ,因為這將返回所需的對象,而無需在外部保留引用。

 function set(object, path, value) { var keys = path.split('.'), last = keys.pop(); keys.reduce(function (o, k) { return o[k] = o[k] || {}; }, object)[last] = value; } var a = {}, path = 'profile.name.en', profileName = 'OleFrank'; set(a, path, profileName); // no need of an assignment, because of // call by reference with an object console.log(a); 

帶有Array#forEach

 function set(object, path, value) { var keys = path.split('.'), last = keys.pop(); keys.forEach(function (k) { object[k] = object[k] || {}; object = object[k]; }); object[last] = value; } var a = {}, path = 'profile.name.en', profileName = 'OleFrank'; set(a, path, profileName); console.log(a); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM