Javascript 根据彼此下的值创建嵌套键并保存到新的 .json 文件

Javascript create nested Keys from Values under eachother & save to a new .json file

我一直在绞尽脑汁想解决这个问题。 假设我们有以下 CSV

const csv=[
"col1,col2,col3,col4,col5,col6", 
"frequency,Weekly,haha,U45,A,WEEKLY", 
"frequency,Every two weeks,def,hel,B,BI-WEEKLY", 
"Time,Monthly,ghi,Tar,C,MONTHLY", 
"Time,Every two months,oiu,60T,D,BI-MONTHLY", 
"type,Quarterly,ppp,Q12,E,QUARTERLY", 
"type,Half yearly,qwf,Y34,F,SEMI-ANNUALLY"]

我想做的是 创建嵌套的 json, 除了在新的 [=23= 中获取以下内容之外,它不起作用]json文件,以col1的值命名。 意思是将所有行与一个公共 col1 分组在一个文件中,如下所示。 如果 col3、col 4 相同且 col5 和 col6 不同,嵌套应如下所示。删除 col2.

{
  "haha": {
    "U45": {
       "A": "Weekly"
       "B": "Semi-annually"
    }
  }
}

到目前为止我所做的就是这些。

const attrs = csv.splice(0,1);
function nested (obj, path, value) {
  let lastKeyIndex=path.length-1;
  lastKeyIndex.map(i => {
    let key = path[i];
    if (!(key in obj)) {
      obj[key]={}
    }
    obj=obj[key]
  })
  obj[path[lastKeyIndex]]=value;
}
csv.map(line => {
  let [col1,col2,col3,col4,col5,col6] = line.split(',')
  let obj={}
  
  nested (obj, [col3, col4, col5], col6)
  return obj
})

非常感谢您的帮助。

您将不得不使用节点 fs 插件来保存不同的文件。我已经用 // node only.

标记了您应该在节点环境中取消注释的行

我所做的是遍历 col3 - col6,检查 属性 是否存在于 parent object 中,如果不存在则创建一个新的 object,然后用它来检查 children。如果您在最后一个 属性,而不是创建一个新的 object,请使用 col6.

// const fs = require("fs"); // node only

let csv = [
    "col1,col2,col3,col4,col5,col6",
    "frequency,Weekly,haha,U45,A,WEEKLY",
    "frequency,Every two weeks,def,hel,B,BI-WEEKLY",
    "Time,Monthly,ghi,Tar,C,MONTHLY",
    "Time,Every two months,oiu,60T,D,BI-MONTHLY",
    "type,Quarterly,ppp,Q12,E,QUARTERLY",
    "type,Half yearly,qwf,Y34,F,SEMI-ANNUALLY"
];

csv.splice(0, 1);

function addProperty(root, pathList) {
    var lastValue = pathList.splice(pathList.length - 1, 1)[0];
    pathList.forEach(function (path, index) {
        var obj = root[path];
        if (!obj) {
            obj = (index === pathList.length - 1) ? lastValue : {};
            root[path] = obj;
        }
        root = obj;
    });
}

function jsonText(obj) {
    return JSON.stringify(obj, (key, value) => value, 4);
}

var files = csv.reduce(function (result, line) {
    var [fileName, , ...pathList] = line.split(",");

    var fileInfo = result[fileName];
    if (!fileInfo) {
        fileInfo = {};
        result[fileName] = fileInfo;
    }

    addProperty(fileInfo, pathList);
    return result;
}, {});

console.log(jsonText(files));

// for (var path in files) fs.writeFileSync(path + ".json", jsonText(files[path])); // node only