如何按元素嵌套对数组进行排序?

3

我有一个数据数组,需要确保元素按照嵌套(父亲、孩子)排序,并且在顶层和嵌套层次中都按字母顺序紧随其后。

初始数据:

const arr = [
  {
    id: 0,
    name: 'A',
    parentId: null,
  },
  {
    id: 78,
    name: 'B',
    parentId: 77,
  },
  {
    id: 1715,
    name: 'C',
    parentId: 78,
  },
  {
    id: 77,
    name: 'D',
    parentId: null,
  },
  {
    id: 1716,
    name: 'E',
    parentId: 1715,
  },
  {
    id: 76,
    name: 'F',
    parentId: null,
  },
];

我的方法不起作用,因为它没有考虑元素的额外嵌套。

function sortData() {
  const result = [];

  arr.sort((a, b) => {
    return a.name.localeCompare(b.name);
  });

  for (const element of arr) {
    if (!element.parentId) {
      const children = folders.filter((el) => el.parentId === element.id);

      result.push(element, ...children);
    }
  }

  return result;
}

我需要获取哪些数据:

const arr = [
  {
    id: 0,
    name: 'A',
    parentId: null,
  },
  {
    id: 77,
    name: 'D',
    parentId: null,
  },
  {
    id: 78,
    name: 'B',
    parentId: 77,
  },
  {
    id: 1715,
    name: 'C',
    parentId: 78,
  },
  {
    id: 1716,
    name: 'E',
    parentId: 1715,
  },
  {
    id: 76,
    name: 'F',
    parentId: null,
  },
];

使用我的方法,我可以获得哪些数据:

const arr = [
  {
    id: 0,
    name: 'A',
    parentId: null,
  },
  {
    id: 77,
    name: 'D',
    parentId: null,
  },
  {
    id: 78,
    name: 'B',
    parentId: 77,
  },
  {
    id: 76,
    name: 'F',
    parentId: null,
  }
];

原始数据可以有多少层嵌套? - Gerardo Furtado
很棒的集合。没有任何限制。 - Vladislav
2个回答

0

只需使用一个简单的排序函数

const arr = [
  {
    id: 0,
    name: "A",
    parentId: null
  },
  {
    id: 78,
    name: "B",
    parentId: 77
  },
  {
    id: 1715,
    name: "C",
    parentId: 78
  },
  {
    id: 77,
    name: "D",
    parentId: null
  },
  {
    id: 1716,
    name: "E",
    parentId: 1715
  },
  {
    id: 76,
    name: "F",
    parentId: null
  }
];

arr.sort(function (a, b) {
if(b.parentId == a.id) return b;
  return a.id - b.id;
});

console.log('arr',arr)


这对我行不通。请看一下“我需要获取哪些数据”这一项。此外,我需要按嵌套(父级、子级)对数据进行排序。 - Vladislav
顺便说一下,你发布的数组中没有嵌套。 - João Pedro
请仔细查看元素的顺序。我需要确保父元素先出现,然后是子元素等等。如何将一个元素及其子元素扩展为数组,并按名称排序。 - Vladislav
有些元素通过parentId与其他元素相关联。 - Vladislav
你可以将children数组添加到它中。 - João Pedro
显示剩余7条评论

0

使用简单的排序函数在我的一侧可以工作。

const arr = [
  {
    id: 0,
    name: 'A',
    parentId: null,
  },
  {
    id: 78,
    name: 'B',
    parentId: 77,
  },
  {
    id: 1715,
    name: 'C',
    parentId: 78,
  },
  {
    id: 77,
    name: 'D',
    parentId: null,
  },
  {
    id: 1716,
    name: 'E',
    parentId: 1715,
  },
  {
    id: 76,
    name: 'F',
    parentId: null,
  },
];

let result = []

const sortData = () => {
  arr.sort((a, b) => {
    return a.name.localeCompare(b.name);
  });
  return arr;
}

console.log(sortData())


这对我行不通。请查看“我需要获取什么数据”的项目。此外,我需要按嵌套(父项,子项)对数据进行排序。 - Vladislav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接