JavaScript 中对象的多级嵌套

Mutli-level nesting of objects in JavaScript

我想编写一个函数,该函数将 JavaScript 对象作为输入,其中包含对象的选定属性和 return 修改后的 indented/grouping 结构,如下所示。

var s1 = {
    "f01":{},
    "f02":{},
    "f03":{},
    "f04":{},
    "f05":{}
};


var s2 = indent_items(s1, ["f02", "f03", "f04"]);

s2 应该这样构造

{
    "f01":{},
    "d01":{
        "f02":{},
        "f03":{},
        "f04":{}
    },
    "f05":{}
};


var s3 = indent_items(s2, ["f03", "f04"]);

s3 应该这样构造

{
    "f01":{},
    "d01":{
        "f02":{},
        "d02":{
            "f03":{},
            "f04":{}
        },
    },
    "f05":{}
};

等等深入许多层次。如何实现?

此解决方案具有递归缩进功能。

  • Object.keys 获取对象的所有键
  • Array.prototype.forEach 对键进行迭代

function indent_items(obj, array) {

    function recursion(o, r) {
        Object.keys(o).forEach(function (k) {
            if (~array.indexOf(k)) {
                r[id] = r[id] || {};
                r[id][k] = o[k];
                return;
            }
            if (typeof o[k] === 'object') {
                r[k] = r[k] || {}
                recursion(o[k], r[k]);
                return;
            }
            r[k] = o[k];
        });
    }

    var result = {},
        id = 'd' + ('0' + ++count).slice(-2);

    recursion(obj, result);
    return result;
}

var count = 0,
    s1 = { "f01": {}, "f02": {}, "f03": {}, "f04": {}, "f05": {} },
    s2 = indent_items(s1, ["f02", "f03", "f04"]),
    s3 = indent_items(s2, ["f03", "f04"]);

document.write('<pre>s1:' + JSON.stringify(s1, 0, 4) + '</pre>');
document.write('<pre>s2:' + JSON.stringify(s2, 0, 4) + '</pre>');
document.write('<pre>s3:' + JSON.stringify(s3, 0, 4) + '</pre>');