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
我一直在绞尽脑汁想解决这个问题。 假设我们有以下 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