【问题标题】:converting directory path to javascript object将目录路径转换为 ​​javascript 对象
【发布时间】:2012-12-29 20:56:10
【问题描述】:

我有一个 PHP 中的目录路径/文件列表,如下所示:

path1/path2/foo1_jpg
path1/foo2_png
path2/path3/bar_pdf
path2/
path1/

我想将这些转换为 javascript 对象。我想只是将“/”转换为句点,然后说类似的话:

<script>
    var files = new Array();
    <?php $dirlist = getFileList("images",true); ?> //returns array of directory paths (and other info)
    <?php foreach($dirlist as $file): ?>
        files.<?=$file['name']?> = "$file['name']"; 

        //where $file['name'] returns, for example, path1.path2.foo1_jpg

    <?php endforeach; ?>
console.log(files);
</script>

我唯一的问题是文件名或目录是否以数字开头,即我不能说:files.001.foo = "bar";

我相信我需要重载点运算符来处理以数字开头的名称。这是最好的方法,还是有其他方法?

我实际上是在尝试将 "x1x2...xn/y1y2...yn/..." 形式的 php 字符串解析为嵌套的 javascript 对象 x1x2x3...xn.y1y2...yn.z1z2z3...zn = {};,其中 x_i、y_i、z_i 等是“/”以外的字符。我想我找到了一些解决方案here 因为该用户还尝试基于分隔字符串(在他的情况下为“_”)动态添加 javascript 对象。

【问题讨论】:

  • 我不明白:你为什么要转换“/”?
  • 是的,为什么要把 "/"s 转换成 "."s?
  • 因为file.dir1/dir2/dir3 = "bar" 不是 javascript 中的有效语法。因此将“/”转换为“.”允许我说file.dir1.dir2.dir3 = "bar"。它还允许我轻松分配嵌套对象。这有意义还是我应该改写?
  • 虽然丑陋,但您可以将它们作为字符串分配和访问。即 file['dir1/dir2/dir3'] 有效。

标签: php javascript dot-operator


【解决方案1】:

我从哪里开始:不要使用new Array() 创建新数组,只需使用文字[]。谷歌原因。

数组与对象不同——它是Object 的扩充。所以它不支持点符号本身。此外,您的 PHP 代码已关闭:引用的 $files['name'] 不明确(PHP 不知道要打印什么:$file 的值,后跟 ['name'] 作为简单字符串,或 $file['name']。但不止于此那:它不在php标签中......

这是做你想做的事的一种方法 - 但你不应该使用它:

var files = {};//create object. properties can be numeric, too
<?php
    foreach ($dirlist as $key => $file)
    {//use $key for numeric index/properties
        echo 'files['.$key.'] = "'.$file['name'].'";';
        //or with double quotes:
        echo "files[$key] = '{$file['name']}';";//need the curly's for ambiguity, or rather avoid ambiguity
    }
?>

如果您希望属性具有前导零,则可以使用 str_padsubstr('000'.$key,-3);

这是我要做的:

var files = JSON.parse('<?= json_encode($dirlist); ?>');

就是这样。

【讨论】:

  • 是的,回显 JSON 是要走的路。 +1
  • @SeainMalkin:当然,这将是我对这个问题的唯一答案,但我不能忽略一个相当严重的语法错误,而且在我看来,JS 数组的滥用非常严重
  • JSON 不会将 php 字符串,例如 "dir1.dir2.dir3" 转换为 javascript 对象 dir1.dir2.dir3 = {};。使用您使用的语法:var files = JSON....,这不会将嵌套对象添加到文件中。假设$dirlist = "pizza.pie"。我本质上是想说files.(JSON.parse($dirlist)) = {};,即files.pizza.pie = {};
  • @thed0ctor:循环通过$dirlist 并分解路径,将它们用作数组键,并以您需要的方式构建一个 assoc-array,然后 json_encoded ......跨度>
猜你喜欢
  • 2016-12-25
  • 2011-07-09
  • 1970-01-01
  • 1970-01-01
  • 2014-01-28
  • 2012-01-25
  • 1970-01-01
  • 2011-02-03
相关资源
最近更新 更多