使用underscore / lodash来转换嵌套的json格式

时间:2018-04-10 14:14:11

标签: javascript underscore.js lodash

嗨,我刚接触下划线实用程序可以帮助我解决这个问题。

示例JSON:

[
  {
    L0: "Level0",
    L1: "Level1",
    L2: "Level2",
    L3: "Level3"
  },
  {
    L0: "Level0",
    L1: "Level1a",
    L2: "Level2",
    L3: "Level3"
  },
  {
    L0: "Level0",
    L1: "Level1",
    L2: "Level2a",
    L3: "Level3"
  },
  {
    L0: "Level0",
    L1: "Level1",
    L2: "Level2",
    L3: "Level3a"
  },
  {
    L0: "Level0a",
    L1: "Level1",
    L2: "Level2",
    L3: "Level3"
  }
];

预期的JSON:

[
  {
    L0: "Level0",
    L1: [
      {
        L1: "Level1",
        L2: [
          {
            L2: "Level2",
            L3: [
              {
                L3: "Level3"
              },
              {
                L3: "Level3a"
              }
            ]
          },
          {
            L2: "Level2a",
            L3: "Level3"
          }
        ]
      },
      {
        L1: "Level1a",
        L2: "Level2",
        L3: "Level3"
      }
    ]
  },
  {
    L0: "Level0a",
    L1: "Level1",
    L2: "Level2",
    L3: "Level3"
  }
];

请通过下划线/ lodash帮助我实现预期的JSON格式。它成为我实现同样的梦魇。我写了冗长的代码仍然无法实现它。感谢您的帮助

提前致谢!

1 个答案:

答案 0 :(得分:0)

对于这个树结构,如果不再需要嵌套项,则需要一个带有相关键的数组,一个对象数组的循环和一个短路属性的循环。

您可以查找关卡的有用属性,如果找到,请检查属性是否为数组,如果没有创建并返回该数组,则继续。

如果未找到,请使用实际键和其余键创建一个新对象并停止迭代。

要获得JSON兼容字符串,您可以使用JSON.stringify,此答案中不包含该字符串。



var array = [{ L0: "Level0", L1: "Level1", L2: "Level2", L3: "Level3" }, { L0: "Level0", L1: "Level1a", L2: "Level2", L3: "Level3" }, { L0: "Level0", L1: "Level1", L2: "Level2a", L3: "Level3" }, { L0: "Level0", L1: "Level1", L2: "Level2", L3: "Level3a" }, { L0: "Level0a", L1: "Level1", L2: "Level2", L3: "Level3" }],
    keys = ['L0', 'L1', 'L2', 'L3'],
    result = [];

array.forEach(o => {
    var level = result;
    keys.some((k, i, kk) => {
        var temp = level.find(l => l[k] === o[k]);

        if (temp && kk[i + 1]) {
            if (!Array.isArray(temp[kk[i + 1]])) {
                temp[kk[i + 1]] = [Object.assign(...kk.slice(i + 1).map(l => ({ [l]: temp[l] })))];
                kk.slice(i + 2).forEach(l => { delete temp[l]; });
            }
            level = temp[kk[i + 1]];
            return;
        }
        level.push(Object.assign(...kk.slice(i).map(l => ({ [l]: o[l] }))));
        return true;
    }, result);
});

console.log(result);

.as-console-wrapper { max-height: 100% !important; top: 0; }