2015-08-09 13 views
6

Tôi đang làm việc trên một bài tập nơi tôi nhắc người dùng cho một danh sách tên, lưu trữ danh sách tên trong một mảng, sắp xếp mảng theo thứ tự tăng dần và in danh sách tên (mỗi tên một dòng). Khi tôi làm như vậy, tôi thấy một giá trị số được hiển thị thay vì một tên trên mỗi dòng. Tại sao chuyện này đang xảy ra?JavaScript trả về giá trị số thay vì chuỗi sau khi sắp xếp mảng

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

Điều này sẽ làm việc nếu nó là một 'for-of' loop:' for (cho tên của namesArray) '. – Xufox

Trả lời

8

Khi bạn sử dụng cấu trúc này:

for (var name in namesArray) { 

giá trị của name sẽ là chỉ số trong mảng (tên tài sản). Nếu bạn muốn giá trị thực tế trong mảng, bạn phải sử dụng tên tài sản/chỉ số để có được giá trị:

document.write(namesArray[name]); 

Tất nhiên, bạn thực sự không nên lặp mảng như vậy ở nơi đầu tiên bởi vì lặp lại tất cả các thuộc tính enumerable của đối tượng mảng (có khả năng bao gồm các phần tử không mảng) như bạn có thể thấy trong this example. Thay vào đó, bạn nên sử dụng một for vòng truyền thống như trong ví dụ mã này rằng sau:

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]); 
    } 

Các tùy chọn khác cho iterating mảng:

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

Hoặc, trong ES6, bạn có thể sử dụng for/of syntax thực sự hoạt động cách bạn đang cố gắng sử dụng cho/in:

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

Bạn cũng có thể muốn hiểu rằng sử dụng document.write() sau khi tài liệu đã được phân tích cú pháp và tải sẽ làm cho trình duyệt xóa tài liệu hiện tại và bắt đầu một tài liệu mới. Tôi không biết bối cảnh lớn hơn mã này phù hợp với, nhưng điều đó có thể gây ra vấn đề cho bạn.

2

Thứ nhất, trong một vòng lặp for..in, đây name đại diện cho phím và không phải là giá trị trong mảng của bạn (bạn nên sử dụng namesArray[name])

Cũng có một điều quan trọng cần lưu ý. Một mảng không được khuyến khích để được looped thông qua sử dụng for..in và nếu như vậy, bạn nên làm điều đó như thế này:

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

Những cách ưa thích thông thường để lặp qua một mảng như sau:

Một đồng bằng vòng lặp for

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

Hoặc một hàm bậc cao với Array.prototype.forEach (IE9 + nếu bạn cần compat với IE)

array.forEach(function (item) { 
    // do something with the item 
}); 
Các vấn đề liên quan