【问题标题】:Map Array inside array using lodash使用 lodash 在数组内映射数组
【发布时间】:2019-05-10 07:47:37
【问题描述】:

我正在尝试操作这个示例对象数组。

var data = [
  { id: 'A', name: 'Test1', parentId: null },
  { id: 'B', name: 'Test2', parentId: 'A'},
  { id: 'C', name: 'Test3', parentId: 'A'},
  { id: 'D', name: 'Test4', parentId: null },
  { id: 'E', name: 'Test5', parentId: 'D'},
  { id: 'F', name: 'Test6', parentId: 'D'},
];

我需要做的就是像这样将数组映射到数组

var data = [
  {
    id: 'A', 
    name: 'Test1', 
    parentId: null, 
    children:[
      { id: 'B', name: 'Test2', parentId: 'A'},
      { id: 'C', name: 'Test3', parentId: 'A'}
    ],
  },
  {
    id: 'D', 
    name: 'Test4', 
    parentId: null, 
    children:[
      { id: 'E', name: 'Test5', parentId: 'D'},
      { id: 'F', name: 'Test6', parentId: 'D'}
    ],
  },
];

使用 lodash 最简单的方法是什么?请帮帮我。

【问题讨论】:

标签: javascript arrays lodash


【解决方案1】:

_.groupBy 在这种情况下更有效。您需要按parentId 对元素进行分组,以便以后轻松分配它们的子元素。

var data = [
  { id: 'A', name: 'Test1', parentId: null },
  { id: 'B', name: 'Test2', parentId: 'A'},
  { id: 'C', name: 'Test3', parentId: 'A'},
  { id: 'D', name: 'Test4', parentId: null },
  { id: 'E', name: 'Test5', parentId: 'D'},
  { id: 'F', name: 'Test6', parentId: 'D'},
];

var map = _.groupBy(data, 'parentId');
map[null].forEach(item => item.children = map[item.id]);
console.log(map[null]);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

【讨论】:

    【解决方案2】:

    您可以使用reduce 方法执行此操作,并为任何深度级别创建嵌套结构。

    var data = [{ id: 'A', name: 'Test1', parentId: null },{ id: 'B', name: 'Test2', parentId: 'A'},{ id: 'C', name: 'Test3', parentId: 'A'},{ id: 'D', name: 'Test4', parentId: null },{ id: 'E', name: 'Test5', parentId: 'D'},{ id: 'F', name: 'Test6', parentId: 'D'}];
    
    function tree(data, parentId = null) {
      return _.reduce(data, (r, e) => {
        if (parentId == e.parentId) {
          const o = _.clone(e);
          const children = tree(data, e.id);
          if (children.length) o.children = children;
          r.push(o)
        }
        return r;
      }, [])
    }
    
    const result = tree(data);
    console.log(result)
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.js"></script>

    【讨论】:

      【解决方案3】:

      _.groupBy的用法最接近你的需要,如前所述选择parentId即可。如果你需要它是递归的,你可以尝试这样的事情:

      var data = [
        { id: 'A', name: 'Test1', parentId: null },
        { id: 'B', name: 'Test2', parentId: 'A'},
        { id: 'C', name: 'Test3', parentId: 'A'},
        { id: 'D', name: 'Test4', parentId: null },
        { id: 'E', name: 'Test5', parentId: 'B'},
        { id: 'F', name: 'Test6', parentId: 'D'},
      ];
      
      function assignChildrens(grouped, parentId) {
          if (!grouped[parentId]) return [];
          return _.map(grouped[parentId], v => {
              v.childrens = assignChildrens(grouped, v.id);
              return v;
          });
      }
      
      var finalData = assignChildrens(_.groupBy(data, 'parentId'), null);
      

      这样,您可以拥有嵌套元素并且仍然可以工作。

      【讨论】:

        【解决方案4】:

        您可以采用单循环方法,将子项与父项以及父项与子项之间的关系放入哈希表中,并仅返回给定根节点的子项。

        var data = [{ id: 'A', name: 'Test1', parentId: null }, { id: 'B', name: 'Test2', parentId: 'A'}, { id: 'C', name: 'Test3', parentId: 'A'}, { id: 'D', name: 'Test4', parentId: null }, { id: 'E', name: 'Test5', parentId: 'D'}, { id: 'F', name: 'Test6', parentId: 'D'}],
            tree = function(data, root) {
                var t = {};
                data.forEach(o => {
                    Object.assign(t[o.id] = t[o.id] || {}, o);
                    t[o.parentId] = t[o.parentId] || { id: o.parentId };
                    t[o.parentId].children = t[o.parentId].children || [];
                    t[o.parentId].children.push(t[o.id]);
                });
                return t[null].children;
            }(data, null);
        
        console.log(tree);
        .as-console-wrapper { max-height: 100% !important; top: 0; }

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-11-08
          • 1970-01-01
          • 1970-01-01
          • 2020-01-31
          • 2016-05-31
          • 2020-12-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多