【问题标题】:Convert nested json into string of specific format depending upon values available inside JSON根据 JSON 中可用的值将嵌套的 json 转换为特定格式的字符串
【发布时间】: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 对象的值,每个属性将具有数组形式的值,其中项目指定路径上的节点。如果一个值出现在多个路径的末尾(如ertuii),它们将有多个路径数组。您必须为您的案例解析这些路径和属性。 stackoverflow.com/a/37836123/4543207用你的数据检查它repl.it/C6ZV

标签: javascript arrays json csv


【解决方案1】:

我尝试了以下方法,它奏效了:

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");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-29
    • 2021-10-29
    • 2022-08-16
    • 2020-02-16
    • 2019-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多