【发布时间】:2016-06-28 16:22:29
【问题描述】:
我有如下的虚拟 JSON 格式:
{
"a":"guig",
"b":"khih",
"c":[
{
"k1":"ert",
"k2":"uii"
},
{
"k1":"ert1"
},
{
"k1":"ert2",
"k2":"uii2"
}],
"d":{
"e":"yfyuf",
"f":[
{
"kk1":"ert",
"kk2":"uii"
},
{
"kk1":"ert1",
"kk2":"uii1"
},
{
"kk1":"ert2",
"kk2":"uii2"
}
]
},
"h":78767
},
{
"a":"guig",
"b":"khih",
"c":[
{
"k1":"ert"
},
{
"k1":"ert1",
"k2":"uii"
},
{
"k1":"ert2",
"k2":"uii2"
}],
"d":{
"e":"yfyuf",
"f":[
{
"kk1":"ert",
"kk2":"uii"
},
{
"kk1":"ert1",
"kk2":"uii1"
}
]
},
"i":78767
},
.....
我想将上面的 JSON 转换为以下格式的字符串(基本上与 csv 兼容,第一行将是它的标题):
a, b, c1_k1, c2_k1, c3_k1, c1_k2, c2_k2, c3_k2, d_e, d_f1_kk1, d_f2_kk1, d_f3_kk1, d_f1_kk2, d_f2_kk2, d_f3_kk2, h, i
guig, khih, ert, ert1, ert2, uii, , uii2, yfyuf, ert, ert1, ert2, uii, uii1, , 78767,
guig, khih, ert, ert1, ert2, , uii , uii2, yfyuf, ert, ert1, ert2, uii, uii1, , ,78767,
像 c1,..Cn 这样的字段与键重复可用一样多,并且在不存在值的地方,逻辑应该为空单元格附加额外的逗号。任意键的值可以是数组、对象或字符串
我尝试的失败逻辑如下
逻辑:1
ItrStr=function(k,h) {
if(typeof k == "string"){
itsLine+= k+",";
itsHdr += h+",";
}else if(k && k.length){
ItrArr(k);
} else{
ItrObj(k);
}
},
ItrArr=function(k) {
if(k.length){
k.forEach((o)=>{
ItrStr(o,"");
});
}else{
ItrObj(k);
}
},
ItrObj=function(k) {
if(k){
let itsKs=Object.keys(k);
itsKs.forEach((o)=> {
let k1 = k[o];
ItrStr(k1,o);
});
}else {
itsLine += ",";
itsHdr += ",";
}
};
let ttp=inputJson;
itsLine="";
ItrObj(ttp);
itsLine=itsLine.replace(/\r/g,"").replace(/\n/g,"")+"\n";
if(!isHdrWrote){
fs.appendFile(dir,itsHdr);
isHdrWrote=true;
}else{
fs.appendFile(dir,itsLine);
}
逻辑:2
findObjectByHDR = function(obj) {
if(!obj){ return "" }
if(Array.isArray(obj)) {
obj.forEach((o)=>{
if(o){
findObjectByHDR(o);
}
});
}else{
for(let i in obj) {
if(obj.hasOwnProperty(i)){
if(typeof obj[i] == "string" || typeof obj[i]== "number"){
if(i.length == 1){
console.log("i: ",i," : ",obj);
}
if(agrtHdr.indexOf(i)<0){
agrtHdr.push(i);
}/*else {
if(addDups[i]){
addDups[i]++;
}else{
addDups[i]=0;
}
agrtHdr.push(addDups[i]+"---"+i);
}*/
}else if(Array.isArray(obj[i])) {
obj[i].forEach((o)=>{
if(o){
//console.log("arr",o);
findObjectByHDR(o);
}
});
}else {
for(let i1 in obj[i]) {
if(obj[i].hasOwnProperty(i1)){
if(typeof obj[i][i1] == "string" || typeof obj[i][i1]== "number"){
if(agrtHdr.indexOf(i1)<0){
agrtHdr.push(i1);
}
}else{
findObjectByHDR(obj[i][i1]);
}
}
}
}
}
}
}
},
findObjectByLBL = function(obj,lbl) {
if(!obj){ return "" }
if(Array.isArray(obj)) {
obj.forEach((o)=>{
if(o){
findObjectByLBL(o,lbl);
}
});
}else if(typeof obj[lbl] == "string" || typeof obj[lbl]== "number"){
return ""+obj[lbl];
}
else if(typeof obj != "string" && typeof obj!= "number") {
for(let i in obj) {
if(obj.hasOwnProperty(i)){
if(Array.isArray(obj[i])) {
obj[i].forEach((o)=>{
if(o){
findObjectByLBL(o,lbl);
}
});
}else if(obj[i]){
if(typeof obj[i] != "string" && typeof obj[i]!= "number"){
findObjectByLBL(obj[i],lbl);
}
}
}
}
}
}
let ttp=inputJson;
itsHdr="";
var crntLin=[];
if(!dtRed){
findObjectByHDR(ttp);
}
if(dtRed){
for(let ik=0;ik<agrtHdr.length;ik++){
let iitln=findObjectByLabel(ttp,agrtHdr[ik]);
if(!iitln){
console.log(ik,":",lineNr,"--",agrtHdr[ik]," : agrtHdr: "," : ",iitln);
}
if(iitln){
crntLin.push(iitln.replace(/\r/g,"").replace(/\n/g,""));
}else{
crntLin.push("");
}
}
fs.appendFile(dir,crntLin.join(",")+"\n");
}
【问题讨论】:
-
有这个
Object.prototype.paths(),它将返回任何对象中的所有路径,包括 JSON。有许多路径的值,因此它返回一个对象,其中返回对象的属性是 JSON 对象的值,每个属性将具有数组形式的值,其中项目指定路径上的节点。如果一个值出现在多个路径的末尾(如ert或uii),它们将有多个路径数组。您必须为您的案例解析这些路径和属性。 stackoverflow.com/a/37836123/4543207用你的数据检查它repl.it/C6ZV
标签: javascript arrays json csv