一个带有重复对象的数组生成一个树形结构的数组

面试题摘抄记录

如何将 [{id: 1}, {id: 2, pId: 1}, ...] 的重复数组(有重复数据)转成树形结构的数组 [{id: 1, child: [{id: 2, pId: 1}]}, ...] (需要去重)

const fn = arr => {
          const res = []
          const map = arr.reduce((res, item) => ((res[item.id] = item), res), {});
          for (const item of Object.values(map)) {
            if (!item.pId) {
              res.push(item)
            } else {
              const parent = map[item.pId]
              parent.child = parent.child || []
              parent.child.push(item)
            }
          }
        return res
}
// Object.values()返回一个数组,其元素是在对象上找到的可枚举属性值。属性的顺序与通过手动循环对象的属性值所给出的顺序相同。
// reduce  arr.reduce(callback,[initialValue])
callback(total, currentValue, currentIndex, arr)
    total   必需。初始值, 或者上一次调用回调返回的值。
    currentValue    必需。当前元素
    currentIndex    可选。当前元素的索引
    arr 可选。当前元素所属的数组对象。
initialValue (可选。传递给函数的初始值,作为第一次调用 callback 的第一个参数)
const map = arr.reduce((res, item) => ((res[item.id] = item), res), {});
//相当于
var map;
var res = {};
arr.foreach(function(item,index){
    res[item.id] = item;
})
map = res;
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容