簡體   English   中英

將JSON數組推入數組的鍵值對

[英]push JSON array into key value pair of an array

我有一個像下面這樣的JSON數組:

rows =[
        {
            "ID":132,
            "TITLE":"Questions one",
            "DESCRIPTION":"Questions one DESCRIPTION",
            "EXPERT_RATING":3,
            "DURATION":15,
            "SOURCE_URL":"http://testing.com",
            "COMMENT":null,
            "UserID": 1214
        },
        {
            "ID":137,
            "TITLE":"Questions two",
            "DESCRIPTION":"Questions two description",
            "EXPERT_RATING":3,
            "DURATION":15,
            "SOURCE_URL":"http://question2.com",
            "COMMENT":null,
            "UserID": 1214
        }
    ]

現在,我想將它推入一個數組,所以它應該如下所示:

res[132] = ['Questions one', 'Questions one DESCRIPTION', 3, 15, 'http://testing.com', null, 1214]
res[137] = ['Questions two', 'Questions two DESCRIPTION', 3, 15, 'http://question2.co', null,1214]

我嘗試了以下鱈魚,但顯示了很多空記錄

rows.forEach(function(key){

                recJson[key.ID] = [key.TITLE, key.DESCRIPTION, key.EXPERT_RATING, key.DURATION, key.SOURCE_URL, key.COACHING_TIPS, key.MGR_COMMENT, key.UserID]             
            });

console.log(recJson);

告訴我我做錯了什么?

如果您直接使用該代碼,則會出現不一致或拼寫錯誤。 您的數據集似乎在TITLE和RTITLE之間進行交換。 如果您的數據真的如此,您可以使用reduce函數和Object.values不加區分地將每個條目的所有值推送到數組:

rows.reduce((acc, curr) => {
  acc[curr["ID"]] = Object.values(curr);
  return acc;
}, {})

這將導致:

{
  132: [132, "Questions one", "Questions one DESCRIPTION", 3, 15, "http://testing.com", null]
  137: (7) [137, "Questions two", "Questions two description", 3, 15, "http://question2.com", null]
}

這應該給你你想要的。

我的方法。

 var rows = [{ "ID": 132, "TITLE": "Questions one", "DESCRIPTION": "Questions one DESCRIPTION", "EXPERT_RATING": 3, "DURATION": 15, "SOURCE_URL": "http://testing.com", "COMMENT": null }, { "ID": 137, "RTITLE": "Questions two", "DESCRIPTION": "Questions two description", "EXPERT_RATING": 3, "DURATION": 15, "SOURCE_URL": "http://question2.com", "COMMENT": null }, { "ID": 137, "RTITLE": "Questions three", "DESCRIPTION": "Questions three description", "EXPERT_RATING": 3, "DURATION": 15, "SOURCE_URL": "http://question3.com", "COMMENT": null }, { "ID": 137, "RTITLE": "Questions four", "DESCRIPTION": "Questions four description", "EXPERT_RATING": 3, "DURATION": 15, "SOURCE_URL": "http://question4.com", "COMMENT": null } ]; var arr = rows.map(ar => Object.values(ar)); var obj = {}; arr.map(ar => { var id = ar[0]; ar.splice(0, 1); //if duplicate key occures creating a nested array. if (obj.hasOwnProperty(id)) { if (Array.isArray(obj[id][0])) { obj[id].push(ar); } else { obj[id] = [obj[id], ar]; } } else { obj[id] = ar; } }); console.log(obj); 

編輯

更新了重復鍵的出現次數。

您的代碼中缺少的位是:

var recJson = [];

這意味着你要通過索引向javascript數組添加一個條目,因此,為了讓javascript添加索引132 ,它必須首先添加索引0 - 131 - 所以你得到了很多null / undefined。

您可以將每個條目推送到數組,但這不允許您通過ID訪問它們 - 因此最好使用對象

var recJson = {};

這會將您的值添加為屬性。

 rows = [{ "ID": 132, "TITLE": "Questions one", "DESCRIPTION": "Questions one DESCRIPTION", "EXPERT_RATING": 3, "DURATION": 15, "SOURCE_URL": "http://testing.com", "COMMENT": null }, { "ID": 137, "RTITLE": "Questions two", "DESCRIPTION": "Questions two description", "EXPERT_RATING": 3, "DURATION": 15, "SOURCE_URL": "http://question2.com", "COMMENT": null } ] var recJson = {}; rows.forEach(function(key) { recJson[key.ID] = [key.RTITLE, key.DESCRIPTION, key.EXPERT_RATING, key.DURATION, key.SOURCE_URL, key.COACHING_TIPS, key.MGR_COMMENT, key.ATTUID]; }); console.log(recJson); 

  • 首先,您需要確保您的數組適合這些索引。
  • 接下來,您需要一些方法來獲取字段的順序。 (確保您的字段名稱一致)
  • 最后,只需減少每行的字段即可獲取適當的值。

 let rows = [{ "ID": 132, "TITLE": "Questions one", "DESCRIPTION": "Questions one DESCRIPTION", "EXPERT_RATING": 3, "DURATION": 15, "SOURCE_URL": "http://testing.com", "COMMENT": null }, { "ID": 137, "RTITLE": "Questions two", "DESCRIPTION": "Questions two description", "EXPERT_RATING": 3, "DURATION": 15, "SOURCE_URL": "http://question2.com", "COMMENT": null }]; let res = new Array(138); let fields = [ 'RTITLE', 'DESCRIPTION', 'EXPERT_RATING', 'DURATION', 'SOURCE_URL', 'COMMENT' ]; rows.forEach(row => { res[row.ID] = fields.reduce((arr, field) => arr.concat(row[field]), []); }); console.log(res); 
 .as-console-wrapper { top: 0; max-height: 100% !important; } 

正如其他人所說,也許一個對象會更好。

rows.reduce((obj, row) => {
  return Object.assign(obj, { [row.ID] : fields.reduce((arr, field) => {
    return arr.concat(row[field]);
  }, []) })
}, res);

 let rows = [{ "ID": 132, "TITLE": "Questions one", "DESCRIPTION": "Questions one DESCRIPTION", "EXPERT_RATING": 3, "DURATION": 15, "SOURCE_URL": "http://testing.com", "COMMENT": null }, { "ID": 137, "RTITLE": "Questions two", "DESCRIPTION": "Questions two description", "EXPERT_RATING": 3, "DURATION": 15, "SOURCE_URL": "http://question2.com", "COMMENT": null }]; let res = {}; let fields = [ 'RTITLE', 'DESCRIPTION', 'EXPERT_RATING', 'DURATION', 'SOURCE_URL', 'COMMENT' ]; rows.reduce((obj, row) => Object.assign(obj, { [row.ID] : fields.reduce((arr, field) => arr.concat(row[field]), []) }), res); console.log(res); 
 .as-console-wrapper { top: 0; max-height: 100% !important; } 

如果你能夠使用它,我建議在這種情況下使用Map()來保存你的新結構。 創建一個帶孔數組並不是一個好主意 或者,您可以使用一個對象,其中keysidsvalues是所需的數組。

這將是Map解決方案:

 const rows = [ { "ID":132, "TITLE":"Questions one", "DESCRIPTION":"Questions one DESCRIPTION", "EXPERT_RATING":3, "DURATION":15, "SOURCE_URL":"http://testing.com", "COMMENT":null }, { "ID":137, "RTITLE":"Questions two", "DESCRIPTION":"Questions two description", "EXPERT_RATING":3, "DURATION":15, "SOURCE_URL":"http://question2.com", "COMMENT":null } ]; let myMap = rows.reduce((acc, o) => { acc.set(o.ID, [ o.hasOwnProperty("TITLE") ? o.TITLE : o.RTITLE, o.DESCRIPTION, o.EXPERT_RATING, o.DURATION, o.SOURCE_URL, o.COMMENT ]); return acc; }, new Map()); console.log("Data for id 132:", myMap.get(132)); console.log("Data for id 137:", myMap.get(137)); 
 .as-console {background-color:black !important; color:lime;} .as-console-wrapper {max-height:100% !important; top:0;} 

請注意,確保生成的數組將按您的要求排序的唯一方法是按所需順序枚舉所有屬性。 您不能信任Object.values()來為所有數組提供相同的鍵順序。 在這里閱讀這個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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