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

6

我正在处理一个练习,要求提示用户输入一组名字,将这组名字存储在数组中,按升序排序这个数组,并逐行打印出这组名字。但是当我这么做时,我看到一个数字值代替了每行一个名字。这是为什么?

var namesArray = [];

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

namesArray.sort();

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

如果使用 for-of 循环,这将起作用:for(let name of namesArray) - Sebastian Simon
2个回答

8

当你使用这个结构:

for (var name in namesArray) {

name的值将是数组中的索引(属性名称)。如果你想要获取数组中的实际值,你需要使用该属性名称/索引来获取值:

document.write(namesArray[name]);

当然,首先你真的不应该以那种方式迭代数组,因为它会迭代数组对象的所有可枚举属性(可能包括非数组元素),你可以在这个示例中看到。相反,你应该使用传统的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 语法,它确实可以像你尝试使用 for/in 一样工作:

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的高阶函数(如果需要与IE兼容,则需要IE9+)

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接