2017-08-24 84 views
1

我有在該特定格式的JavaScript數組的特定JSON格式轉換字符串的數組:在使用jQuery或Javascript

var arr = 
    ["header1",  //section header 
    false,   //subsection, no 
    "1240","1243", //assets 
    true,"1",  //subsection, yes = 1 
    "1344","1136", //assets 
    true,"1",  //subsection, yes = 1 
    "1347",   //assets 
    "header2",  //section header 
    false,   //subsection, no 
    "1130"];   //assets 

上述陣列具有序列:

1)的陣列與「標題」是部分值。

2)數組中的「false」表示本節沒有任何小節。所以在JSON中,子值爲null。

3)後面跟着false是這些部分的所有資產值。

4)「true」表示本節有一個小節。下一個值的子部分值後跟「真」。在我的例子中,它是1.其次是該分段的所有資產值。

5)當遇到字符串「header」的下一個數組值時。它是下一節的開始。

我必須把它轉換成格式:

{ 
    "templateForm": 
    [{ 
     "sectionId":"header1", 
     "values":[ 
     { 
      "sub":null, 
      "assets":[1240,1243] 
     }, 
     { 
      "sub":1, 
      "assets":[1344,1136] 
     }, 
     { 
      "sub":1, 
      "assets":[1347] 
     } 
     ] 
    }, 
    { 
     "sectionId":"header2", 
     "values":[ 
     { 
      "sub":null, 
      "assets":[1130] 
     } 
     ] 
    }] 
} 

我已經嘗試了很多,但沒能做到這一點。我試圖創建json格式作爲字符串,但在解析它爲javascript對象時出錯。請幫我解決這個問題。

我的不完整的代碼如下:

function makeJSON(formItems) { 
     var subString1 = "header"; 
     var strStart = '{"templateForm":['; 
     var strSection = ""; 
     for (var i = 0; i < formItems.length; i++) { 
      var isHeader = item.indexOf(subString1) !== -1; 
      if(isHeader){ 
       strSection += '{"sectionId":'+item[i]; 
       while(item != true || item != false){ 
       } 
      } 

      var item = formItems[i] + ""; 
      console.log(item); 
      if (item == "true") { 
       var subSectionId = item[++i]; 
      } else if (item == "false") { 
       var subSectionId = null; 
      } 
     } 
     var strEnd = "]}"; 
     var strFinal = strStart + strSection + strEnd; 
     console.log(strFinal); 
     var obj = JSON.parse(strFinal); 
     console.log(obj); 
    } 
+3

你嘗試過什麼碼?你卡在哪裏?你得到什麼錯誤? – Cruiser

+2

數據來自哪裏?它的格式非常糟糕IMO。 –

+0

@ NathanP.Can你建議我一個很好的格式 –

回答

3

你可以使用一個直接的方法與對象插入的單一階段。

var array = ["header1", false, "1240", "1243", true, "1", "1344", "1136", true, "1", "1347", "header2", false, "1130"], 
 
    result = [], 
 
    last = {}; 
 

 
array.forEach(function (a) { 
 
    if (a.toString().slice(0, 6) === 'header') { 
 
     last.section = { sectionId: a, values: [] }; 
 
     result.push(last.section); 
 
     return; 
 
    } 
 
    if (typeof a === 'boolean') { 
 
     last.sub = { sub: null, assets: [] }; 
 
     last.section.values.push(last.sub); 
 
     last.next = a; 
 
     return; 
 
    } 
 
    if (last.next) { 
 
     last.sub.sub = +a; 
 
     last.next = false; 
 
     return; 
 
    } 
 
    last.sub.assets.push(+a); 
 
}); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

1

數據源的格式留下太多的渴求。但是,如果這是你必須一起工作,然後下面的代碼可以進行轉換:

var arr = ["header1",false,"1240","1243",true,"1","1344","1136",true,"1","1347", "header2", false, "1130"]; 
 

 
var result = arr.reduce((acc, val) => { 
 
    if (String(val).indexOf("header") === 0) { 
 
     acc.push({ 
 
      sectionId: val, 
 
      values: [] 
 
     }); 
 
     return acc; 
 
    } 
 
    var last = acc[acc.length-1], 
 
     lastVal = last.values[last.values.length-1]; 
 
    if (typeof val === 'boolean') { 
 
     last.values.push({ 
 
      sub: val || null, 
 
      assets: [] 
 
     }) 
 
    } else if (lastVal.sub === true) { 
 
     lastVal.sub = +val; 
 
    } else { 
 
     lastVal.assets.push(+val); 
 
    } 
 
    return acc; 
 
}, []); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }