2016-02-11 36 views
1

在我的情況,我有序列化的HTML數組:如何以有效的方式將混合值的數組轉換爲JSON數組?

[{ name: "Questions[0].ID", value: 1 }, {name: "Questions[0].Answer", value: "Yes"}, { name: "Questions[1].ID", value: 2 }, {name: "Questions[1].Answer", value: "No"}] 

我需要序列化這個HTML表單並改變其格式,因爲這個HTML是在其他地方使用的局部圖,其中整體形式發佈。但是在這裏,我只對問題數據感興趣,並且需要以特定的JSON格式發佈。

的JSON結構將是:

[{ QuestionID: 1, Answer: "Yes" }, { QuestionID: 2, Answer: "No" }] 

溶液1 - 環通過陣列:

var surveyResponses = [{ 
 
    name: "Questions[0].ID", 
 
    value: 1 
 
}, { 
 
    name: "Questions[0].Answer", 
 
    value: "Yes" 
 
}, { 
 
    name: "Questions[1].ID", 
 
    value: 2 
 
}, { 
 
    name: "Questions[1].Answer", 
 
    value: "No" 
 
}]; 
 
var responsesList = new Array(); 
 
if (surveyResponses != null && surveyResponses.length > 0) { 
 
    for (var i = 0; i < surveyResponses.length; i++) { 
 
    var answer = surveyResponses[i++].value; 
 
    var questionID = surveyResponses[i].value; 
 
    responsesList.push({ 
 
     QuestionID: questionID, 
 
     Answer: answer 
 
    }); 
 
    } 
 
} 
 
document.write("<pre>" + JSON.stringify(responsesList) + "</pre>")

解決方案2 - grep的+地圖:

var surveyResponses = $("#QuestionsDiv").serializeArray(); 
var offset = 0; 
var responsesList = $.grep(surveyResponses, 
    function (answer) { 
     return answer.name.indexOf("Answer") > -1; 
    }).map(function (answer, i) { 
     return { QuestionID: surveyResponses[i + (++offset)].value, Answer: answer.value }; 
    }); 

到目前爲止,我想出了這兩個解決方案。我特別喜歡解決方案2,但是,代碼的可讀性並不是最好的。

是否有任何其他(更好)的方式來做這種轉換?特別是沒有循環數組?

回答

3

你可以使用reduce;

var out = arr.reduce(function(p, c, i, a) { 
    if (i === 0 || i % 2 === 0) { 
    p.push({ QuestionID: a[i].value, Answer: a[i + 1].value }); 
    } 
    return p; 
}, []); 

DEMO

這將然而,擊中每個數組元素。我不知道你爲什麼不願意循環,但這是迄今爲止最簡單的方法,並且只會觸及其他所有元素。

for (var out = [], i = 0, l = arr.length; i < l; i+=2) { 
    out.push({ QuestionID: arr[i].value, Answer: arr[i + 1].value }); 
} 

DEMO

+1

感謝@Andy,我喜歡多麼簡單,這些都是。 –

2

你可以嘗試這樣的:

不知道它是更好的,但一種替代方法。

var data = [{ name: "Questions[0].ID", value: 1 }, {name: "Questions[0].Answer", value: "Yes"}, { name: "Questions[1].ID", value: 2 }, {name: "Questions[1].Answer", value: "No"}]; 
 

 
var _tmp = {}; 
 
data.forEach(function(item){ 
 
    var k = item.name.split("."); 
 
    if(!_tmp[k[0]]) 
 
    _tmp[k[0]] = {} 
 
    
 
    if(k[1]==="ID") 
 
     k[1] = "QuestionID" 
 
    _tmp[k[0]][k[1]] = item.value; 
 
}); 
 

 
var result = Object.keys(_tmp).map(function(k){return _tmp[k]}); 
 

 
document.write("<pre>" + JSON.stringify(result,0,2) + "</pre>")