2015-08-09 83 views
6

我正在進行一項練習,其中提示用戶列出名稱,將名稱列表存儲在數組中,按升序對數組進行排序,以及打印名稱列表(每行一個)。當我這樣做時,我看到一個數值顯示,而不是每行一個名稱。這是爲什麼發生?JavaScript排序後返回數值而不是字符串

var namesArray = []; 

do { 
    var names = prompt("Enter a name: "); 
    namesArray.push(names); 
} while (names != "") 

namesArray.sort(); 

for (var name in namesArray) { 
    document.write(name); 
} 
+0

如果它是'for-for'循環:'for(讓namenameArray)'',這將起作用。 – Xufox

回答

8

當您使用此結構:

for (var name in namesArray) { 

name值是數組(屬性名)在索引中。如果你想在陣列中的實際值,你必須使用該屬性名稱/索引來獲取值:

document.write(namesArray[name]); 

當然,你真的不應該遍歷數組擺在首位,因爲這樣它可以迭代數組對象的所有可枚舉屬性(可能包含非數組元素),如您在this example中所見。相反,你應該使用傳統的for環路遵循此代碼示例:

var namesArray = []; 

    do { 
     var names = prompt("Enter a name: "); 
     namesArray.push(names); 
    } while (names != "") 

    namesArray.sort(); 

    for (var i = 0; i < namesArray.length; i++) { 
     document.write(namesArray[i]); 
    } 

其他選項遍歷數組:

namesArray.forEach(function(value) { 
    document.write(value) 
}); 

或者,ES6,您可以使用for/of syntax它實際上工作如何你試圖用於/在:

for (let value of namesArray) { 
    document.write(value); 
} 

您也可能想了解在文檔已經被分析並加載後使用document.write()將導致瀏覽器清除當前文檔並開始新文檔。我不知道這個代碼適合的更大的上下文,但是這可能會導致你的問題。

2

首先,在for..in循環,這裏name代表你的數組中的鍵,而不是值(你應該使用namesArray[name]

而且還有要注意的另一個重要的事情。不推薦使用數組通過使用for..in如果是循環播放,你應該這樣做是這樣的:通過一個數組

for (var key in array) { 
    if (array.hasOwnProperty(key)) { 
     // then do stuff with array[key] 
    } 
} 

通常首選循環方式有以下幾種:

一普通的for循環

for (var i = 0, l = array.length; i < l; i++) { 
    // array[i] 
} 

或用Array.prototype.forEach高階函數(IE9 +,如果你需要使用COMPAT IE)

array.forEach(function (item) { 
    // do something with the item 
}); 
相關問題