2017-02-14 31 views
0

位奇怪的一個。我正在使用下面的代碼從json對象構建一個數組,以便稍後在代碼中進行引用。然而,看起來,當創建每個數組的最後一個項目時,而不是添加一個新項目時,該項目的密鑰顯示爲數組的長度。JavaScript數組中顯示爲長度的最後一個鍵?

perfsJson = $.parseJSON(result); 
var extras = new Array(); 
for (var i = perfsJson.length - 1; i >= 0; i--) { 
    var obj = perfsJson[i]; 
    if (obj != null) { 
     if (obj.Extras != null) { 
      for (var perf_no in obj.Extras) { 
       if (extras[perf_no] == undefined) { 
        var arr = new Array(); 
        for (var extra in obj.Extras[perf_no]) { 
         if (arr[extra] == undefined) { 
          arr[extra] = obj.Extras[perf_no][extra]; 
         } 
        } 
        extras[perf_no] = arr; 
       } 
      } 
      break; 
     } 
    } 
} 

結果數組出現如下:

resulting array

任何想法是怎麼回事?

編輯:下面的JSON 樣品

{ 「其他」:{ 「32516」:{ 「24186」: 「實施例文本」}, 「32515」:{ 「24186」: 「實施例文本」} 「32514」:{「24186」:「示例文本」},「32512」:{「24186」:「示例文本」},「32513」:{「24186」:「示例文本」},「32511」: 「32518」:{「24186」:「示例文本」},「32509」:{「24186」:「示例文本」},「32507」:{「24186」 「示例文本」},「32503」:{「24186」:「示例文本」},「32506」:{「24186」:「示例文本」},「32505」:{「24186」:「示例文本」} ,「32508」:{「24186」:「示例文本」},「32502」:{},「32497」:{}}}

+0

您通常應該儘量避免在Javascript數組中丟失鍵。如果您需要使用特定的鍵,則需要使用對象或「Map」。 – lonesomeday

+0

看起來你正在使用'for ... in'in數組循環,並且你也獲得了'length'。 – adeneo

+2

代碼看起來像JS版本的https://twitter.com/dr4goonis/status/476617165463105536 – Pavlo

回答

1

發生了什麼事情聽說您正在使用for..in來遍歷數組,這是一個no-不是因爲它迭代不是數組元素的屬性(例如.length屬性)。相反,使用Array#forEach

perfsJson = $.parseJSON(result); 
var extras = new Array(); 
for (var i = perfsJson.length - 1; i >= 0; i--) { 
    var obj = perfsJson[i]; 
    if (obj != null) { 
    if (obj.Extras != null) { 
     obj.Extras.forEach(function (item, idx) { 
     if (typeof extras[idx] === 'undefined') { 
      var arr = new Array(); 
      item.forEach(function (item2, idx2) { 
       if (typeof arr[idx2] === 'undefined') { 
        arr[idx2] = item2; 
       } 
      }); 
      extras[idx] = arr; 
     } 
     }); 
     break; 
    } 
    } 
} 

最內層的循環是很沒有意義的,可以與Array#slice更換:

perfsJson = $.parseJSON(result); 
var extras = new Array(); 
for (var i = perfsJson.length - 1; i >= 0; i--) { 
    var obj = perfsJson[i]; 
    if (obj != null) { 
    if (obj.Extras != null) { 
     obj.Extras.forEach(function (item, idx) { 
     if (typeof extras[idx] === 'undefined') { 
      extras[idx] = item.slice(); 
     } 
     }); 
     break; 
    } 
    } 
} 

下一個內循環可以Array#map和兩個if語句來代替可組合:

perfsJson = $.parseJSON(result); 
var extras = new Array(); 
for (var i = perfsJson.length - 1; i >= 0; i--) { 
    var obj = perfsJson[i]; 
    if (obj != null&& obj.Extras != null) { 
    extras = obj.Extras.map(function (item) { 
     return item.slice(); 
    }); 
    break; 
    } 
} 

其實這個代碼大部分都可以簡化:

function findLastElement(arr) { 
    for (var i = arr.length - 1; i >= 0; i -= 1) { 
     if (arr[i] != null && arr[i].Extras != null) { return arr[i]; } 
    } 
} 

perfsJson = $.parseJSON(result); 
var lastElement = findLastElement(perfsJson); 
var extras = lastElement 
    ? lastElement.Extras.map(function (item) { return item.slice(); }) 
    : []; 
+0

哇謝謝,這是一個嚴肅的深入答案。但是,如果我嘗試使用.forEach或.map,我會收到一個錯誤,指出「lastElement.Extras.map不是函數」或「lastElement.Extras.forEach不是函數」。有任何想法嗎? – HuwD

+0

@HuwD「lastElement.Extras」實際上是一個數組嗎?你能告訴我們你的JSON看起來像什麼(不是全部,但是有代表性的例子)?你使用什麼執行環境(瀏覽器等)? – JLRishe

+0

我相信它目前正在作爲一個對象處理,添加了JSON樣本以編輯 – HuwD

相關問題