JavaScript - динамически генерировать путь к файлу из объекта - PullRequest
0 голосов
/ 13 февраля 2020

Я искал несколько часов, но до сих пор ничего не нашел, поэтому спрашиваю здесь. У меня есть небольшой PHP скрипт, который генерирует JSON дерево файлов и папок, а затем выбирает его на стороне клиента как переменную JavaScript. Результат обычно выглядит так:

{
  "folder_name" : {
    "another_folder": {
      "third_folder": {
        0: "some_file.txt"
        1: "another_file.png"
        2: "third_file.pdf"
      }
    }
  }
}

То, что я хотел достичь, выглядело бы примерно так:

generatePath("some_file.txt") 

Что бы вернуть:

"folder_name/another_folder/third_folder/some_file.txt"

Итак, мой вопрос: как я могу создать путь к любому из этих файлов только из объекта в JavaScript? Есть ли способ сделать что-нибудь подобное?

[Редактировать]: К сожалению, у меня больше нет кода для показа ...

Ответы [ 2 ]

0 голосов
/ 13 февраля 2020

Вы можете создать для этого рекурсивную функцию, используя for...in l oop, которая будет хранить предыдущие элементы пути в одном массиве.

const data = {
  "folder_name": {
    "another_folder": {
      "third_folder": {
        0: "some_file.txt",
        1: "another_file.png",
        2: "third_file.pdf"
      }
    }
  }
}

function generatePath(data, file) {
  let result

  (function getPath(obj, file, prev = []) {
    for (let i in obj) {

      if (typeof obj[i] == 'object') {
        getPath(obj[i], file, prev.concat(i).slice())
      }

      if (file == obj[i]) {
        result = prev.concat(obj[i]).join('/')
      }
    }
  })(data, file)

  return result;
}

console.log(generatePath(data, "third_file.pdf"))
console.log(generatePath(data, "some_file.txt"))
0 голосов
/ 13 февраля 2020

Таким образом, предполагая, что ввод является действительным JSON, и он будет разбираться в JS объект, вот некоторый подход:

const data = {
  "folder_name" : {
    "another_folder": {
      "third_folder": {
        "0": "some_file.txt",
        "1": "another_file.png",
        "2": "third_file.pdf"
      }
    }
  },
  "folder_name2" : {
    "0": "up_file.txt",
    "another_folder2": {
      "third_folder2": ["some_file2.txt", "another_file2.png", "third_file2.pdf"]
    }
  }
}

function generatePath(value, currentPath = '', currentObject = data) {
  for (const property in currentObject) {
    if (currentObject[property] === value) {
      return `${currentPath}/${value}`;
    }
    if (typeof currentObject[property] === 'object') {
      const result = generatePath(value, `${currentPath && currentPath + '/'}${property}`, currentObject[property]);
      if (result) {
        return result;
      }
    }
  }
}


document.write(
  generatePath("some_file.txt"), 
  '<br>', 
  generatePath("some_file2.txt"),
  '<br>',
  generatePath("up_file.txt"),
  '<br>',
  generatePath("no_file.txt")
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...