2015-08-09 30 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 
}); 
相关问题