javascript - 对象数组反展平的更好解决方案

标签 javascript arrays tree flatten

对于以下对象数组

[
 {"Corp": "ABC", "T1": "HW A/V", "T2": "A/V System","T3": "Audio","Prod": "Audio System","Mfr": "One"},
 {"Corp": "ABC", "T1": "HW A/V", "T2": "A/V System","T3": "Audio","Prod": "Audio System","Mfr": "Two"},
 {"Corp": "ABC", "T1": "HW A/V", "T2": "A/V System","T3": "Video","Prod": "Video System","Mfr": "Other"}
]

我打算得到一个像下面这样的未展平的对象:

[{
"Corp": "ABC",
"List": [{
    "T1": "HW A/V",
    "List": [{
        "T2": "A/V System",
        "List": [{
            "T3": "Audio",
            "List": [{
                "Prod": "Audio System",
                "List": [
                    {"Mfr": "One"},
                    {"Mfr": "Two"}
                ]
            }]
        },
        {
            "T3": "Video",
            "List": [{
                "Prod": "Video System",
                "List": [
                    {"Mfr": "Other"}
                ]
            }]
        }]
    }]
}]

}] 我确实得到了我想要得到的结果,如上所述。我使用下划线来获得结果。以下代码片段为我完成了这项工作:

var items = _.map(_.groupBy(itemList, 'Corp'), function (a) {
        return _.extend(_.pick(a[0], 'Corp'), {
            List: _.map(_.groupBy(a, 'T1'), function (b) {
                return _.extend(_.pick(b[0], 'T1'), {
                    List: _.map(_.groupBy(b, 'T2'), function (c) {
                        return _.extend(_.pick(c[0], 'T2'), {
                            List: _.map(_.groupBy(c, 'T3'), function (d) {
                                return _.extend(_.pick(d[0], 'T3'), {
                                    List: _.map(_.groupBy(d, 'Prod'), function (e) {
                                        return _.extend(_.pick(e[0], 'Prod'), {
                                            List: _.map(e, function (elem) {
                                                return _.pick(elem, 'Mfr')
                                            })
                                        });
                                    })
                                });
                            })
                        });
                    })
                });
            })
        });
    });

现在,我所寻找的就是是否有人可以增强我的解决方案。我想优化这个过程的空间和时间。

PS:早上,我问了一个类似的问题,要求解决方案,该问题被标记为 太广泛,并被置于保留所以我已经添加了这个问题的解决方案,现在我所寻找的是一个更好的解决方案。

谢谢

最佳答案

为了避免叠瓦式语句,您可能需要定义“扩展键”列表并对其进行迭代。

使用类似以下内容自动提取 key 是很诱人的:

expandKeys = _.keys(itemList[0]);

但是由于 Javascript 不保证对象中键的顺序,因此您确实应该显式定义此列表。

下面是一些示例代码。

var itemList = [
  {"Corp": "ABC", "T1": "HW A/V", "T2": "A/V System", "T3": "Audio", "Prod": "Audio System", "Mfr": "One"},
  {"Corp": "ABC", "T1": "HW A/V", "T2": "A/V System", "T3": "Audio", "Prod": "Audio System", "Mfr": "Two"},
  {"Corp": "ABC", "T1": "HW A/V", "T2": "A/V System", "T3": "Video", "Prod": "Video System", "Mfr": "Other"}
];

var expandKeys = [ 'Corp', 'T1', 'T2', 'T3', 'Prod', 'Mfr' ];

function expandList(list, keys) {
  var node, obj, root = {};

  _.each(list, function(item) {
    obj = root;
    _.each(keys, function(key) {
      obj = (obj.List = obj.List || []);
      node = _.find(obj, function(i) { return i[key] == item[key]; });

      if(node === undefined) {
        obj.push(node = {});
        node[key] = item[key];
      }
      obj = node;
    });
  });
  return root.List;
}

var res = expandList(itemList, expandKeys);
console.log(res);
<script src="http://underscorejs.org/underscore-min.js"></script>

关于javascript - 对象数组反展平的更好解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38823689/

相关文章:

javascript - 如何在 Haml 中包含内联 JavaScript?

javascript - 数组的嵌套类,想要获取外部数组的索引

tree - 对于一个有n个节点的完全二叉树,有多少个节点是叶子节点?

在二进制和 Base64 之间转换时 JavaScript 缓冲区不一致

javascript - 为什么这个正则表达式在有或没有连字符/破折号转义的情况下都可以工作

javascript - JQuery 模板 : How to preserve backslashes in content?

java - 类似汉诺塔的东西

java - 数组 - 平均

javascript - 遍历树并获取每个对象的深度

javascript - 如何有效过滤 TreeView 保留其现有结构?