Может ли эта JS функция forEach стать проще или элегантнее? - PullRequest
1 голос
/ 24 марта 2020

Я пытаюсь найти пары ключ: значение в многомерном массиве JS. Код, который я написал, кажется, работает нормально, но я хочу знать, есть ли более элегантный способ написания его с помощью какой-либо техники ES6. Массив - это массив файлов, которые я пытаюсь найти, чтобы найти определенную пару ключ: значение.

Итак, многомерный массив выглядит так:

Вот снимок экрана массива json https://i.stack.imgur.com/QbvxW.jpg

А это код:

const search = (key, val, arr, result) => {
  arr.forEach(folderItem => {
    if(folderItem[key] === val) {
      result.push(folderItem);
    } 
    if(folderItem.files && folderItem.files.length) search(key, val, folderItem.files, result);
  });
  return result;
}
let result = search('name', 'Folder2', [files], []);

Вот также пример ручки https://codepen.io/muhammadkazimsadiq/pen/YzXJEgO

1 Ответ

0 голосов
/ 24 марта 2020

Вы можете взять Array#flatMap и добавить вложенные найденные элементы, не используя другой параметр для result.

const
    files = { name: "files", is_dir: 1, url: "test", files: [{ name: "folder1", is_dir: 1, url: "test\\/folder1", files: [{ name: "folder1_1", is_dir: 1, url: "test\\/folder1\\/folder1_1", files: [{ name: "index.txt", is_dir: 0, url: "test\\/folder1\\/folder1_1\\/index.txt" }] }, { name: "folder1_2", is_dir: 1, url: "test\\/folder1\\/folder1_2", files: [{ name: "index.txt", is_dir: 0, url: "test\\/folder1\\/folder1_2\\/index.txt" }] }, { name: "index.txt", is_dir: 0, url: "test\\/folder1\\/index.txt" }] }, { name: "folder2", is_dir: 1, url: "test\\/folder2", files: [{ name: "folder2_1", is_dir: 1, url: "test\\/folder2\\/folder2_1", files: [{ name: "index.txt", is_dir: 0, url: "test\\/folder2\\/folder2_1\\/index.txt" }] }, { name: "folder2_2", is_dir: 1, url: "test\\/folder2\\/folder2_2", files: [{ name: "index.txt", is_dir: 0, url: "test\\/folder2\\/folder2_2\\/index.txt" }] }] }, { name: "folder3", is_dir: 1, url: "test\\/folder3", files: [] }, { name: "index.txt", is_dir: 0, url: "test\\/index.txt" }] },
    search = (key, val, arr) => arr.flatMap(folderItem => [
        ...(folderItem[key] === val ? [folderItem] : []), 
        ...search(key, val, folderItem.files || [])
    ]),
    result = search('name', 'folder2', [files]);

console.log(result);
...