簡體   English   中英

遍歷JSON格式的對象數組並修改和擴展它,最好使用Underscore.js

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM