【问题标题】:Create nested object dynamically with forEach使用 forEach 动态创建嵌套对象
【发布时间】:2016-09-25 19:53:05
【问题描述】:

我有一个“路径”字符串:'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 循环,但后来它不再工作了。这是为什么呢??

【问题讨论】:

  • 向我们展示您的 forEach 尝试。
  • 可能由词法作用域引起...
  • 为什么选择forEach? reduce 会更合适。
  • .forEach() 不会 return 任何事情,以防你在你的 for 循环中尝试过。

标签: javascript loops object


【解决方案1】:

您可以使用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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    • 2017-02-07
    • 2014-04-29
    相关资源
    最近更新 更多