JavaScript-从对象动态生成文件路径

时间:2020-02-12 21:45:26

标签: javascript object path

我已经看了几个小时,但仍然找不到任何有关它的信息,所以我在这里问。我有一个小的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 :(得分:0)

因此,假设输入是真实的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")
);

答案 1 :(得分:0)

您可以使用for...in循环为此创建递归函数,该循环将先前的路径元素存储在一个数组中。

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"))