javascript - 根据 JSON 中可用的值将嵌套 json 转换为特定格式的字符串

标签 javascript arrays json csv

我的虚拟 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,

field like c1,..Cn comes as much as key duplication are available and wherever values are not present the logic should append extra comma for empty cell. Values of any key can be Array, Object or String

我尝试的失败逻辑如下

逻辑: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");
                }

最佳答案

我尝试了以下有效的方法:

var dir = path.join(__dirname,'./slack.csv'),
    jsn=require(path.join(__dirname,'./slack.json')),
    itsHdrAll=[],
    itsHdrAllAr=[],
    finlHdr=[],
    findObjectByHDR = function (){
        let obj=arguments[0];
        let arg1=arguments[1];
        if(Array.isArray(obj)){
            obj.forEach((o,i)=>{
                let crntProp=arg1?arg1:[];
                crntProp.push({cameFrm:"Arr",ind:i});
                findObjectByHDR(o,crntProp)
            });
        }else{
            for(let k in obj) {
                if(obj.hasOwnProperty(k)){
                    if(typeof obj[k] == "string" || typeof obj[k] == "number"){
                        let arg1=arguments[1];
                        let itsHdr="";
                        if(arg1){
                            arg1.forEach(o=>{
                                if(o.cameFrm=="Arr"){
                                    if(o.ind !=0){
                                        itsHdr=itsHdr.substring(0,itsHdr.length-4) + o.ind+"___";
                                    }else{
                                        itsHdr+= o.ind+"___";
                                    }
                                }else if(o.cameFrm=="Obj"){
                                    itsHdr+= o.prop+"___";
                                }
                            });
                        }
                        itsHdr += k+"___";
                        itsHdrAll.push(itsHdr);
                    }else {
                        let crntProp=arg1?arg1:[];
                        crntProp.push({cameFrm:"Obj",prop:k});
                        findObjectByHDR(obj[k],crntProp)
                    }
                }
            }
        }
    };
    for(let j=0;j<jsn.length;j++){
        findObjectByHDR(jsn[j]);
        itsHdrAllAr.push(itsHdrAll);
        itsHdrAll=[];
    }
    itsHdrAllAr.forEach(o=>{
        o.forEach(o1=>{
            if(finlHdr.indexOf(o1)<0){
                finlHdr.push(o1);
            }
        });
    });
    finlHdr=finlHdr.map(o=>{
        return o.substring(0,o.length-3);
    });
    finlHdr.sort();
    console.log("finlHdr: ",finlHdr);
    fs.appendFile(dir,finlHdr.join(",")+"\n");

关于javascript - 根据 JSON 中可用的值将嵌套 json 转换为特定格式的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38053080/

相关文章:

javascript - 继续检查 Div 是否包含特定文本

javascript - Discord.js - 如何编辑 message.embed() 语句?

arrays - F# 扫描缓冲区,找到以\c\f 开头且后面不跟逗号的最后一部分

python - 在 Python 中从 json 对象创建连接字符串

具有空值的 json_array_elements

javascript - 商店中的 Flux ajax api 调用返回父函数

javascript - ruby rails : Stripe JS & Elements causing Content Security Policy error

arrays - 是否有任何理由按第一项传递数组?

c++ - C++中返回多维数组的函数

javascript - 无法获取Web api json响应的内容,返回空白