Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/474.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 要映射的JSON文件_Javascript_Json_Node.js - Fatal编程技术网

Javascript 要映射的JSON文件

Javascript 要映射的JSON文件,javascript,json,node.js,Javascript,Json,Node.js,我有一个.json数据存储,希望使用Map()特定的方法来获取值。 下面是my.json文件的一些示例: "program": [ { "name": "program1", "phases": [ { "name": "A", "cycles": [ { "name": "day

我有一个.json数据存储,希望使用
Map()
特定的方法来获取值。 下面是my.json文件的一些示例:

"program": [
    {
        "name": "program1",
        "phases": [
            {
                "name": "A",
                "cycles": [
                    {
                        "name": "day 1",
                        "exercises": [
                            {
                                "name": "workout1",
                                "set": 4,
                                "repetitions": 8
                            },
                            {
                                "name": "workout2",
                                "set": 4,
                                "repetitions": 8
                            }
                        ]
                    }
                ]
            }
        ]
    }
]
我的目标是这样做:

console.log(program.get("program1").phases.get("A").name);
我有一个类似的函数,可以将.json文件转换为映射

const datastore = require("./datastore.json");

function toMap(array, prop) {
    const map = new Map();
    for(const el of array) map.set(el[prop], el);
    return map;
}

var program = toMap(datastore, "name");
但这只转换一个“映射层”,所以我只能执行一个
.get()
,而不能执行更深层次的操作


接下来,我要修改映射并将其保存回数据存储。

您必须使用递归来修复
toMap()
函数。请参阅下面的固定版本

function toMap(array, prop) {
    const map = new Map();
    for(const el of array) {
      map.set(el[prop], el);
      for(var key in el) {
        if (Array.isArray(el[key])) {
          el[key] = toMap(el[key], prop);
        }
      }
    }
    return map;
}

我修复了@Vipin Kumar版本中的一些bug:

function toMap(array, key) {
    const map = new Map();
    for(const element of array) {
        if (element[key]) {
            map.set(element[key], element);
        }
        for(var subkey in element) {
            if (Array.isArray(element[subkey])) {
                if (element[subkey][0][key]) {
                    element[subkey] = toMap(element[subkey], key);
                }
            }
        }
    }
    return map;
}

它只将具有给定键的数组转换为映射,而不是将每个数组转换为映射

为什么要将其设置为
映射
?为什么不像使用
.forEach
循环那样在.json结构上迭代呢?因为我想使用
.get()
选择值,有时我需要连续执行3次,所以我不想使用3
.forEach
。在本例中,我认为映射比forEach的性能更好,因为我的应用程序需要大量信息。如何将转换后的映射保存回json文件?对不起,上面的代码也会在没有给定属性的情况下转换映射内的数组。