【问题标题】:JavaScript - Dynamically generate a file path from an objectJavaScript - 从对象动态生成文件路径
【发布时间】:2020-02-12 21:45:26
【问题描述】:

我已经找了几个小时了,但我仍然找不到任何关于它的信息,所以我在这里问。我有一个小的 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 中的对象创建到任何这些文件的路径?有没有办法做这样的事情?

[编辑]:遗憾的是我没有任何代码可以显示了......

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 我什至不知道从哪里开始,我尝试创建一个递归函数来读取对象的键/值,然后将它们粘合在一起。我认为这是一个很好的起点,但我失败了。我在互联网上查看了任何提示或想法,但似乎没有人需要这样的东西。没有教程,没有信息,什么都没有。
  • 你能分享你失败的努力吗?你已经证明你知道你想要什么
  • 可悲的是,在我十几岁的时候,经历了数小时的失败后,我大发雷霆,把所有东西都烧掉了……现在已经过了一天。这就是我没有分享任何代码的原因。
  • 此 JSON 无效。您不能将数字作为对象属性并且缺少逗号。那么它到底是什么样子的呢?

标签: javascript object path


【解决方案1】:

所以假设输入是一个真正的 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")
);

【讨论】:

  • 当我查看它时,它似乎与我尝试过的非常接近,但它更简单。非常感谢您的帮助!现在我终于明白它是如何工作的了……
【解决方案2】:

您可以使用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"))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-25
    • 2014-10-22
    相关资源
    最近更新 更多