创建封装数组JS

时间:2015-10-02 10:22:58

标签: javascript jquery arrays

我有一个这样的对象:

"1": "test1"
"1.1": "test2"
"1.1.1": "test3"
"1.2": "test4"
"2": "test5"

我想创建一个这样的数组:

"data": [
  {"data": "test1",
  "children": [
    {"data": "test2",
    "children": [{"data": "test3"}]},
    {"data": "test4"}]},
  {"data": "test5"}
]

我开始循环列表并用点分割键 我想也许我可以先建立一个returnArray [splitedkey [0]] [splitedkey [1]],但我不知道我的列表有多少级别。

有谁知道如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

您遇到的非显而易见的问题:

  • 通过对象中的键进行迭代可能与您编写它们的顺序不一致。在遇到1.1.1之前,算法有可能会遇到1,因此实施需要使空白父母{ data: null, children [] }
  • 它显然是递归数据结构,必须注意递归算法使用duff数据正确终止

这是一个解决方案。 setVal会递归爬网到accessPath指定的正确深度,[1, 1, 1]是一组访问者(例如nestObj)。 obj读取var obj = { "1": "test1", "1.1": "test2", "1.1.1": "test3", "1.2": "test4", "2": "test5" } function setVal (array, accessPath, val) { if (accessPath.length === 1) { if (array[accessPath] === undefined) array[accessPath] = { data: val, children: [] }; else array[accessPath].data = val; } else { // Deals with out-of-order iteration if (array[accessPath[0]] === undefined) array[accessPath[0]] = { data: null, children: [] }; setVal(array[accessPath[0]].children, accessPath.slice(1), val); } } function nestObj (obj) { var ret = []; Object.keys(obj).forEach(function (key) { var val = obj[key]; var accessPath = key.split(".").map(function (entry) { return parseInt(entry, 10); }); setVal(ret, accessPath, val); }); return ret; } // The format you specified var answer = { data: nestObj(obj) }; ,提取密钥,将其映射到指标,然后将它们附加到您的返回值中。

parseInt

您不一定需要在访问密钥上使用ALTER Table account_invoice ALTER amount_total SET DATA TYPE NUMERIC(5,Y); 。这个算法(通常)可以使用任意字符串键通过关联数组。

答案 1 :(得分:0)

试试这个:

    var a = {"1": "test1", "1.1": "test2", "1.1.1": "test3", "1.2": "test4", "2": "test5"};
    var b = {data: []};
    Object.keys(a).forEach(function (item, index, arr) {
        if (item.indexOf(".") !== -1) {
            console.log(item, a[item]);
            var sp = item.split(".");
            var parent = b.data[sp[0] - 1];
            for (var i = 1; i < sp.length - 1; i++) {
                parent = parent.children[sp[i] - 1];
            }
            parent.children.push({data: a[item], children: []});
        } else {
    
            b.data.push({data: a[item], children: []});
        }
    });
    console.log(b);