2017-04-26 54 views
0

我想創建一個輸出數組,它接受來自其子數組的所有參數並創建一個結果數組。 很難用言語解釋,所以我正在用下面的一個例子來解釋。使用子陣列的所有元素創建一個新陣列

var myArr=[ 
       { 
        "Id":1, 
        "Name":'Ken', 
        "Age" : '30', 
        "Hobbies" : [{'HobbyId':1,'HobbyName':'Swimming'},{'HobbyId':2,'HobbyName':'Reading'}], 
        "Skills" : [{'SkillId':1,'SkillName':'PHP'},{'SkillId':2,'SkillName':'MySQL'}], 
        "Language" : [{'LangId':2,'LangName':'English'},{'LangId':3,'LangName':'Chinese'}] 
       }, 
       { 
        "Id":2, 
        "Name":'Mike', 
        "Age" : '20', 
        "Hobbies" : [], 
        "Skills" : [], 
        "Language" : [] 
       }, 
       { 
        "Id":3, 
        "Name":'Charlie', 
        "Age" : '25', 
        "Hobbies" : [{'HobbyId':5,'HobbyName':'Dance'},{'HobbyId':6,'HobbyName':'Sing'},{'HobbyId':7,'HobbyName':'Writing'}], 
        "Skills" : [], 
        "Language" : [{'Id':7,'Name':'English'}] 
       } 
      ] 

在上面的例子中有3個名爲Hobbies,Skills和Languages的子數組。 除了這三個,我還會有更多的子數組。 我實際上想要刪除子數組邏輯並使其成爲一個平面數組。

所以,當創建這個扁平數組時,我想從子數組中考慮所有參數,即使子數組是空的。 所以我的結果數組的第一項將有所有子數組的第一項等等。 即使子數組是空數組,我也需要考慮鍵,並將值作爲空值輸入。

所以我的結果數組將如下:

var resultArray = [ 
       { 
        "Id":1, 
        "Name":'Ken', 
        "Age" : '30', 
        "HobbyId" : 1, 
        "HobbyName" : 'Swimming', 
        "SkillId" : 1, 
        "SkillName":'PHP', 
        "LangId" : 2, 
        "LangName" : 'English' 
       }, 
       { 
        "Id":1, 
        "Name":'Ken', 
        "Age" : '30', 
        "HobbyId" : 2, 
        "HobbyName" : 'Reading', 
        "SkillId" : 2, 
        "SkillName":'MySQL', 
        "LangId" : 3, 
        "LangName" : 'Chinese' 
       }, 
       { 
        "Id":2, 
        "Name":'Mike', 
        "Age" : '20', 
        "HobbyId" : '', 
        "HobbyName" : '' , 
        "SkillId" : '', 
        "SkillName":'', 
        "LangId" : '', 
        "LangName" : '' 
       }, 
       { 
        "Id":3, 
        "Name":'Charlie', 
        "Age" : '25', 
        "HobbyId" : 5, 
        "HobbyName" : 'Dance', 
        "SkillId" : '', 
        "SkillName":'', 
        "LangId" : 7, 
        "LangName" : 'English' 
       }, 
       { 
        "Id":3, 
        "Name":'Charlie', 
        "Age" : '25', 
        "HobbyId" : 6, 
        "HobbyName" : 'Sing', 
        "SkillId" : '', 
        "SkillName":'', 
        "LangId" : '', 
        "LangName" : '' 
       }, 
       { 
        "Id":3, 
        "Name":'Charlie', 
        "Age" : '25', 
        "HobbyId" : 7, 
        "HobbyName" : 'Writing', 
        "SkillId" : '', 
        "SkillName":'', 
        "LangId" : '', 
        "LangName" : '' 
       } 
      ] 
+2

雖然它可能並且相對容易(您很快可能會得到一些答案),但在混合數據實體時這樣做是個壞主意。你最終得到2個Kens和3個Charlies。你爲什麼要這樣? – mik01aj

+1

我需要使用jqGrid和一些rowspans創建一個表,所以實際上2個Kens和3個Charlies將被劃分爲1,並在行前顯示它們各自的Hobbies等,這是用jqGrid實現的唯一方法。 – Sonali

+0

[通過數組字段展開對象的嵌套數組]的可能重複(http://stackoverflow.com/questions/40250107/flatten-a-nested-array-of-objects-over-a-array-field) –

回答

0

這似乎產生你想要的東西:

let results = []; 
for(let {Id, Name, Age, Hobbies, Skills, Language} of myArr) { 
    let numRows = Math.max(1, Hobbies.length, Skills.length, Language.length); 
    for (let i=0; i<numRows; i++) { 
     let {HobbyId, HobbyName} = Hobbies[i] || {}; 
     let {SkillId, SkillName} = Skills[i] || {}; 
     let {LangId, LangName} = Language[i] || {}; 
     results.push({ 
      Id, Name, Age, 
      HobbyId, HobbyName, 
      SkillId, SkillName, 
      LangId, LangName, 
     }); 
    } 
} 
console.table(results); 

的非平凡位是:

  • 我用曲迭代一點ES6語法。您可能想要詳細瞭解一下object destructuring,shorthand object literalsfor..of
  • 我開始迭代之前計算所需的行數,這樣我就不必每次都檢查是否應該去下一個人。
  • 我做Hobbies[i] || {}爲了確保我總是有一個對象來解析let {HobbyId, HobbyName}。我這樣做,因爲它比每次檢查null簡單。