[英]Iterate over JSON formatted array of objects and modify and extend it, preferably using Underscore.js
我從JSON格式的數據庫中檢索了數據,該數據已分配給變量-“ var選項卡”。
JSON格式如下:
[{
"TAB_ID": "1",
"TAB_NAME": "TAB ONE",
"TAB_DISPLAY": "1",
"QUESTIONS": [{
"QUESTION_ID": 1,
"QUESTION": "Question number one",
"ANSWER": ""
}, {
"QUESTION_ID": 2,
"QUESTION": "Question number two",
"ANSWER": ""
}, {
"QUESTION_ID": 3,
"QUESTION": "Question number six",
"ANSWER": ""
}]
}, {
"TAB_ID": "1",
"TAB_NAME": "TAB ONE",
"TAB_DISPLAY": "1",
"QUESTIONS": [{
"QUESTION_ID": 1,
"QUESTION": "Question number one",
"ANSWER": "Some Other Answer"
}, {
"QUESTION_ID": 2,
"QUESTION": "Question number two",
"ANSWER": ""
}, {
"QUESTION_ID": 3,
"QUESTION": "Question number six",
"ANSWER": "Some Still Different Answer"
}]
}]
我需要遍歷數組並執行以下操作:
對於選項卡中的每個問題,如果該問題具有答案,則需要向該問題添加一個附加的鍵/值“ HAS_ANSWER”:“ 1”。
{
"QUESTION_ID": 1,
"QUESTION": "Question number one",
"ANSWER": "Some Other Answer",
"HAS_ANSWER": "1"
}
我已經花了數小時閱讀文章,查看示例代碼並閱讀了Underscore文檔,我知道這應該很簡單,但是我無法全神貫注於如何實現這一點。
我的理解是,我可能想使用嵌套的_.map函數,但是我看過的所有示例都返回對象數組的一個子集,而不是修改和擴展的對象,因此我需要以相同格式的JSON數據(對象數組),但具有上述更改和添加。
任何幫助將不勝感激。
更新:
使用這個:
data = _.map(data, obj => _.map(obj.QUESTIONS, q => {
if (q.ANSWER) {
q.HAS_ANSWER = 1;
}
return q;
}));
這將遍歷問題,並相應地對其進行修改,但是返回的對象將刪除數據的外層-它僅返回問題數組,並且不保留TAB數據:
"TAB_ID": "1",
"TAB_NAME": "TAB ONE",
"TAB_DISPLAY": "1",
解決方案是在外部數組上使用_.each,在內部數組上使用_.map。
data = _.each(data, obj => _.map(obj.QUESTIONS, q => {
if (q.ANSWER) {
q.HAS_ANSWER = 1;
}
return q;
}));
注意:此=>語法僅在Javascript的較新實現中有效,並且Safari / Webkit當前不支持此語法,因此請改用此語法以獲得更好的兼容性
data = _.each(data, function(obj){
_.map(obj.QUESTIONS, function(q){
if (q.ANSWER) {
q.HAS_ANSWER = 1;
}
return q;
});
});
這正是我需要的方式。
這可以使用普通的JavaScript和Array#map
。
// Iterate over data
data = data.map(obj => obj.QUESTIONS.map(q => {
// If question has answer, then add `HAS_ANSWER` property
if (q.ANSWER) {
q.HAS_ANSWER = 1;
}
// Update question object
return q;
}));
var data = [{ "TAB_ID": "1", "TAB_NAME": "TAB ONE", "TAB_DISPLAY": "1", "QUESTIONS": [{ "QUESTION_ID": 1, "QUESTION": "Question number one", "ANSWER": "" }, { "QUESTION_ID": 2, "QUESTION": "Question number two", "ANSWER": "" }, { "QUESTION_ID": 3, "QUESTION": "Question number six", "ANSWER": "" }] }, { "TAB_ID": "1", "TAB_NAME": "TAB ONE", "TAB_DISPLAY": "1", "QUESTIONS": [{ "QUESTION_ID": 1, "QUESTION": "Question number one", "ANSWER": "Some Other Answer" }, { "QUESTION_ID": 2, "QUESTION": "Question number two", "ANSWER": "" }, { "QUESTION_ID": 3, "QUESTION": "Question number six", "ANSWER": "Some Still Different Answer" }] }]; data = data.map(obj => obj.QUESTIONS.map(q => { if (q.ANSWER) { q.HAS_ANSWER = 1; } return q; })); console.log(data); document.getElementById('output').innerHTML = JSON.stringify(data, 0, 4);
<pre id="output"></pre>
Underscore / Lodash中的相同代碼
data = _.map(data, obj => _.map(obj.QUESTIONS, q => {
if (q.ANSWER) {
q.HAS_ANSWER = 1;
}
return q;
}));
使用標准Javascript的Array.prototype.forEach()方法,它看起來可能像這樣:
tabs.forEach(tab => {
tab['QUESTIONS'].forEach(question => {
if (question['ANSWER']) {
question['HAS_ANSWER'] = 1;
}
});
});
var tabs = [{ "TAB_ID": "1", "TAB_NAME": "TAB ONE", "TAB_DISPLAY": "1", "QUESTIONS": [{ "QUESTION_ID": 1, "QUESTION": "Question number one", "ANSWER": "" }, { "QUESTION_ID": 2, "QUESTION": "Question number two", "ANSWER": "" }, { "QUESTION_ID": 3, "QUESTION": "Question number six", "ANSWER": "" }] }, { "TAB_ID": "1", "TAB_NAME": "TAB ONE", "TAB_DISPLAY": "1", "QUESTIONS": [{ "QUESTION_ID": 1, "QUESTION": "Question number one", "ANSWER": "Some Other Answer" }, { "QUESTION_ID": 2, "QUESTION": "Question number two", "ANSWER": "" }, { "QUESTION_ID": 3, "QUESTION": "Question number six", "ANSWER": "Some Still Different Answer" }] }]; tabs.forEach(tab => { tab['QUESTIONS'].forEach(question => { if (question['ANSWER']) { question['HAS_ANSWER'] = 1; } }); }); console.log(tabs);
這種方法修改了數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.