在javascript中解析JSON对象(键/值对)

在javascript中解析JSON对象(键/值对),javascript,json,node.js,Javascript,Json,Node.js,我试图通过编写一些测试应用程序来了解NodeJS。到目前为止,我做得还不错,但有一件事让我感到困惑,那就是以下几点 我让它读取文件夹目录,然后解析每个文件夹中的settings.json文件(这样我就可以根据文件夹内容动态构建UI)。问题是,我似乎无法使用JSON对象“降低级别” 例如,在php背景中,您可以执行以下操作来“逐步”遍历数组: <?php $arr = [ 'folder1' => [ 'name' => 'tes

我试图通过编写一些测试应用程序来了解NodeJS。到目前为止,我做得还不错,但有一件事让我感到困惑,那就是以下几点

我让它读取文件夹目录,然后解析每个文件夹中的
settings.json
文件(这样我就可以根据文件夹内容动态构建UI)。问题是,我似乎无法使用JSON对象“降低级别”

例如,在php背景中,您可以执行以下操作来“逐步”遍历数组:

<?php
    $arr = [
        'folder1' => 
            [ 'name' => 'test',
              'icon' => 'icon-test'
            ],
        'folder2' => 
            [ 'name' => 'test-2',
              'icon' => 'icon-test-2'
            ]
    ];

    foreach($arr as $k => $v){
        // folder1 level
        foreach($v as $k2 => $v2){
                // name / icon level.
                echo $k2 . ' is ' . $v2;
        }
    }
?>
但理想情况下,我需要从JSON中提取“名称”和“图标”。我似乎找不到任何方法来做这件事

我知道这可能有点混乱,但我只是想弄清楚我的脑袋。为了完全清楚起见,目录结构和我的简单JSON文件如下:

模块目录结构

modules
|____ test
      |____ config.json
|____ test-2
      |____ config.json
{
  "name": "test",
  "icon": "test-icon"
}
config.json(示例)


您当前正在为in循环使用
,虽然这样做有效,但在对数组进行迭代时,您理想情况下希望为下一个
循环使用

以下是一个例子:

for (var i = 0; i < folders.length; i++) {
    var folder = folders[i]

    /* work with directory .. */

    for (var j = 0; j < folder.items.length; j++){
        var item = folder.items[j]

        /* work with item.. */
    }
}
for(var i=0;i
中迭代数组时不使用
的原因是数组可以包含实际上不是数组一部分的对象,即函数

使用
for in
循环,您将迭代包含的数组,然后迭代附加到该数组的任何对象/函数


for next
循环将只对数组内容进行迭代。

您当前正在对in
循环使用
,而在这种情况下,在对数组进行迭代时,您理想情况下希望对next
循环使用

for(var module of modules){
   console.log(module.name,module.icon);
   //or over all
   for(var value of module) console.log(value);
}
以下是一个例子:

for (var i = 0; i < folders.length; i++) {
    var folder = folders[i]

    /* work with directory .. */

    for (var j = 0; j < folder.items.length; j++){
        var item = folder.items[j]

        /* work with item.. */
    }
}
for(var i=0;i
中迭代数组时不使用的原因是数组可以包含实际上不是数组一部分的对象,即函数

使用
for in
循环,您将迭代包含的数组,然后迭代附加到该数组的任何对象/函数

for next
循环将仅迭代数组内容

for(var module of modules){
   console.log(module.name,module.icon);
   //or over all
   for(var value of module) console.log(value);
}
值上循环的for。使用for..in(在键上循环):

值上循环的for。使用for..in(在键上循环):


我不知道你只有一个子目录还是可以有多个子目录?如果可以是任何深度,请使用递归函数,如:

function iterateFolder(array) {
  for (var i = 0; i < array.length; i++) {
    if ($.isArray(array[i]))
      iterateFolder(array[i]);
    else
      //Add to global variable for example or parse just the values
  }
}
函数迭代器文件夹(数组){
对于(var i=0;i
我不知道您是只有一个子目录还是可以有多个子目录?如果可以是任何深度,请使用递归函数,如:

function iterateFolder(array) {
  for (var i = 0; i < array.length; i++) {
    if ($.isArray(array[i]))
      iterateFolder(array[i]);
    else
      //Add to global variable for example or parse just the values
  }
}
函数迭代器文件夹(数组){
对于(var i=0;i
尝试执行for of循环,而不是for in循环

            // example from a old proj
            // your code has in 
            // if you are using es6 syntax, you should use let instead of var
            for (let element of section.elements) {
                let $element;
                $element = $parent.find(`label[for=${element._data_text}]`);                    
                $element.html(`<span>${element[lang]}</span>`);
            }

您可以在

处查看html和标记,尝试执行for-of循环而不是for-in循环

            // example from a old proj
            // your code has in 
            // if you are using es6 syntax, you should use let instead of var
            for (let element of section.elements) {
                let $element;
                $element = $parent.find(`label[for=${element._data_text}]`);                    
                $element.html(`<span>${element[lang]}</span>`);
            }

您可以在

查看html和标记,我知道您是从node开始的,但我想您应该使用“reduce”而不是“for循环”来处理这种情况(这只是我个人的观点xd)。您可以找到许多关于如何使用此函数的指南,变量“d”是一个数组,所有数组都有“reduce”函数

大概是这样的:

const modules=d.reduce((全部,当前)=>{
全部[当前]=当前| |{}
all[current]=JSON.parse(fs.readFileSync(uu dirname+'/modules/'+current+'/config.JSON',utf8'))
全部归还;
}, {})
我在创建一些文件夹时对其进行了测试,并给出了以下信息:

​​​​​{ test: { name: 'test', icon: 'test-icon' },​​​​​ ​​​tes_2: { name: 'test-2', icon: 'test-icon-2' } }​​​​​

我知道您是从node开始的,但我想在这种情况下应该使用“reduce”而不是“for循环”(这只是我个人的观点xd)。您可以找到许多关于如何使用此函数的指南,变量“d”是一个数组,所有数组都有“reduce”函数

大概是这样的:

const modules=d.reduce((全部,当前)=>{
全部[当前]=当前| |{}
all[current]=JSON.parse(fs.readFileSync(uu dirname+'/modules/'+current+'/config.JSON',utf8'))
全部归还;
}, {})
我在创建一些文件夹时对其进行了测试,并给出了以下信息:

​​​​​{ test: { name: 'test', icon: 'test-icon' },​​​​​ ​​​tes_2: { name: 'test-2', icon: 'test-icon-2' } }​​​​​

我会看一看。它可用于node.js,它是轻量级的,IMO是一个非常好的javascript实用程序库。它有收集方法,可以像你问的那样迭代一个对象。你的问题是什么?上面的代码工作正常吗?除了在循环中使用for..inarray@Jonasw我已经澄清了我的问题,但是如果你重新阅读,它确实说我正在寻找JSON对象——比我已经能做的更进一步。我会看一看。它可用于node.js,它是轻量级的,IMO是一个非常好的javascript实用程序库。它有收集方法,可以像你问的那样迭代一个对象。你的问题是什么?上面的代码工作正常吗?除了在循环中使用for..inarray@Jonasw我已经澄清了我的问题,但是如果你重新阅读它,它确实说我正在寻找一个JSON对象——比我已经能做的更远。但是它是一个数组吗?当我阅读它时,它仍然是一个JSON对象(使用JSON.parse)。JSON对象可以是数组和对象的集合,JSON.parse可以处理这两者。我不知道——我认为这是一个相互排斥的东西(对象或数组没有