嵌套对象

在一个扁平数组中递归地嵌套相互链接的对象。

  • 使用递归。
  • 使用Array.prototype.filter()过滤idlink匹配的项。
  • 使用Array.prototype.map()将每个项映射到一个新对象,该对象具有一个children属性,该属性根据哪些项是当前项的子项递归地嵌套项。
  • 省略第二个参数id,默认为null,表示该对象没有链接到另一个对象(即顶级对象)。
  • 省略第三个参数link,默认使用'parent_id'作为链接对象的属性,该属性通过其id将对象链接到另一个对象。
const nest = (items, id = null, link = 'parent_id') =>
  items
    .filter(item => item[link] === id)
    .map(item => ({ ...item, children: nest(items, item.id, link) }));

const comments = [
  { id: 1, parent_id: null },
  { id: 2, parent_id: 1 },
  { id: 3, parent_id: 1 },
  { id: 4, parent_id: 2 },
  { id: 5, parent_id: 4 }
];
const nestedComments = nest(comments);
// [{ id: 1, parent_id: null, children: [...] }]