Сортировка массива объектов на основе идентификатора родителя без циклов for или forEach

Учитывая следующий массив объектов, я хочу, чтобы все самые длинные каталоги папок были основаны на родительских идентификаторах, разделенных запятыми.

Все выходы

  • база, 0
  • base,12 (12 имеет родительский идентификатор base)
  • база, 1
  • base,1,2,9 (9 имеет родительский идентификатор 2, 2 имеет родительский идентификатор 1)
  • база,1,3
  • база,1,4,5,6,7,8 (все связаны)

Я пробовал решения из этого ответа stackoverflow

Однако, Первый: использование цикла for или функции foreach слишком медленно для моего сайта. Два: он не выводит тот результат, который я хочу.

в настоящее время у меня есть это

<script>
  const data = [{
        "id": "12",
        "parent_id": "base",
        "name": "",
        "contents": ["Knowledge Base.pdf", "Knowledge.pdf"]
      }, {
        "id": "0",
        "parent_id": "base",
        "name": "Test Folder 1",
        "contents": ["81321-ksdjncewks.docx", ".pdf"]
      }, {
        "id": "1",
        "parent_id": "base",
        "name": "Test Folder 2",
        "contents": ["jmjmtj.docx", "thyfjd.pdf", "hdfjfj.xlsx", "dyjyk.pptx", "adad.jpg", ",k,ya.png"]
      }, {
        "id": "2",
        "parent_id": "1",
        "name": "Test Folder 3",
        "contents": ["dg.docx", "tj,j,h.pdf", "yjhas.xlsx", "thjyrsku.pptx",
          "AWGWR.jpg", "greht.png"
        ]
      }, {
        "id": "3",
        "parent_id": "1",
        "name": "Test Folder 4",
        "contents": ["mmmm.docx", "bbbb.pdf", "zzzz.xlsx", "xxxx.pptx", "ccc.jpg", "vvv.png"]
      }, {
        "id": "4",
        "parent_id": "1",
        "name": "Test Folder 5",
        "contents": ["qqqqqq.docx",
          "wwww.pdf", "eeee.xlsx", "rrrr.pptx", "ttttt.jpg", "yyyy.png"
        ]
      }, {
        "id": "5",
        "parent_id": "4",
        "name": "Test Folder 6",
        "contents": ["nooo.docx", "hi.pdf", "wassup.xlsx", "nice.pptx"]
      }, {
        "id": "6",
        "parent_id": "5",
        "name": "Test Folder 7",
        "contents": ["nydnooo.docx", "hhdjhi.pdf", "wndassup.xlsx", "nidfyce.pptx"]
      }, {
        "id": "7",
        "parent_id": "6",
        "name": "Test Folder 8",
        "contents": ["nohmgjmoo.docx", "hk,kvi.pdf", "wassu,jv,f.xlsx", "nicchmchvnve.pptx"]
      }, {
        "id": "8",
        "parent_id": "7",
        "name": "Test
        Folder 9 ", "
        contents ": ["
        nmhmxooo.docx ", "
        hhdjdhi.pdf ", "
        wasmjmvsup.xlsx ", "
        niddnhgdgce.pptx "] }, { "
        id ": "
        9 ", "
        parent_id ": "
        2 ", "
        name ": "
        Test Folder 10 ", "
        contents ": ["
        nqfefrsgooo.docx ", "
        advdhi.pdf ", "
        wafasdfjyjsup.xlsx ", "
        nifgghjdce.pptx "] } ]

    let results = data.reduce((results, data) => {
(results[data.parent_id] = results[data.parent_id] || []).push(data);
return results;
}, {})
console.info(results)
</script>

🤔 А знаете ли вы, что...
JavaScript поддерживает объектно-ориентированное программирование.


53
1

Ответ:

Решено

Вы можете построить объект и получить все пути.

const
    getPathes = (object, key) => object[key]
        ?.flatMap(id => getPathes(object, id).map(a => [key, ...a]))
        ?? [[key]],
    data = [{ id: "12", parent_id: "base", name: "", contents: ["Knowledge Base.pdf", "Knowledge.pdf"] }, { id: "0", parent_id: "base", name: "Test Folder 1", contents: ["81321-ksdjncewks.docx", ".pdf"] }, { id: "1", parent_id: "base", name: "Test Folder 2", contents: ["jmjmtj.docx", "thyfjd.pdf", "hdfjfj.xlsx", "dyjyk.pptx", "adad.jpg", ",k,ya.png"] }, { id: "2", parent_id: "1", name: "Test Folder 3", contents: ["dg.docx", "tj,j,h.pdf", "yjhas.xlsx", "thjyrsku.pptx", "AWGWR.jpg", "greht.png"] }, { id: "3", parent_id: "1", name: "Test Folder 4", contents: ["mmmm.docx", "bbbb.pdf", "zzzz.xlsx", "xxxx.pptx", "ccc.jpg", "vvv.png"] }, { id: "4", parent_id: "1", name: "Test Folder 5", contents: ["qqqqqq.docx", "wwww.pdf", "eeee.xlsx", "rrrr.pptx", "ttttt.jpg", "yyyy.png"] }, { id: "5", parent_id: "4", name: "Test Folder 6", contents: ["nooo.docx", "hi.pdf", "wassup.xlsx", "nice.pptx"] }, { id: "6", parent_id: "5", name: "Test Folder 7", contents: ["nydnooo.docx", "hhdjhi.pdf", "wndassup.xlsx", "nidfyce.pptx"] }, { id: "7", parent_id: "6", name: "Test Folder 8", contents: ["nohmgjmoo.docx", "hk,kvi.pdf", "wassu,jv,f.xlsx", "nicchmchvnve.pptx"] }, { id: "8", parent_id: "7", name: "Test Folder 9", contents: ["nmhmxooo.docx", "hhdjdhi.pdf", "wasmjmvsup.xlsx", "niddnhgdgce.pptx"] }, { id: "9", parent_id: "2", name: "Test Folder 10", contents: ["nqfefrsgooo.docx", "advdhi.pdf", "wafasdfjyjsup.xlsx", "nifgghjdce.pptx"] }],
    references = data.reduce((r, { id, parent_id }) => {
        (r[parent_id] ??= []).push(id);
        return r;
    }, {}),
    result = getPathes(references, 'base').map(a => a.join());

console.info(result);
console.info(references);
.as-console-wrapper { max-height: 100% !important; top: 0; }