排序数组后JavaScript返回数值而不是字符串

时间:2015-08-09 00:16:02

标签: javascript arrays sorting

我正在进行一项练习,其中提示用户输入名称列表,将名称列表存储在数组中,按升序对数组进行排序,并打印名称列表(每行一个)。当我这样做时,我看到显示的数值而不是每行一个名称。为什么会这样?

var namesArray = [];

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

namesArray.sort();

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

2 个答案:

答案 0 :(得分: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 / in的方式有关:

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

您还可能希望了解在已经解析并加载文档后使用document.write()将导致浏览器清除当前文档并启动新文档。我不知道这段代码适合的更大的上下文,但这可能会给你带来问题。

答案 1 :(得分:2)

首先,在for..in循环中,此处name代表键而不是数组中的值(您应该使用namesArray[name]

另外还有一点需要注意。建议不要使用for..in来循环数组,如果是这样,你应该这样做:

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

循环数组的常用首选方法如下:

for plain for循环

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

或更高阶函数Array.prototype.forEach(IE9 +,如果你需要与IE竞争)

array.forEach(function (item) {
    // do something with the item
});