Lặp lại mọi thuộc tính của một đối tượng trong javascript bằng Prototype?


89

Có cách nào để lặp lại mọi thuộc tính của một đối tượng bằng khung JavaScript Nguyên mẫu không?

Đây là tình huống: Tôi nhận được phản hồi AJAX trong JSON trông giống như sau:

{foo: 1, bar: 2, barobj: {75: true, 76: false, 85: true}}

Nếu tôi đánh giá phản hồi json đó với một biến response, tôi muốn có thể lặp lại từng thuộc tính trong response.barobjđối tượng để xem chỉ mục nào là đúng và chỉ mục nào là sai.

Nguyên mẫu có cả hai Object.keys()Object.values()nhưng kỳ lạ là dường như không có một Object.each()chức năng đơn giản ! Tôi có thể lấy kết quả của Object.keys () và Object.values ​​() và tham chiếu chéo cái kia khi tôi lặp qua một cái, nhưng đó là một vụ hack nên tôi chắc chắn rằng có một cách thích hợp để làm điều đó!

Câu trả lời:


42

Trước tiên, bạn phải chuyển đổi đối tượng của mình theo nghĩa đen thành Hash nguyên mẫu :

// Store your object literal
var obj = {foo: 1, bar: 2, barobj: {75: true, 76: false, 85: true}}

// Iterate like so.  The $H() construct creates a prototype-extended Hash.
$H(obj).each(function(pair){
  alert(pair.key);
  alert(pair.value);
});

Hoàn hảo! Điều này thật đúng với gì mà tôi đã tìm kiếm.
OverloadUT

57
Thật không may vì một câu hỏi tương tự đã bị đóng, một câu hỏi chỉ muốn lặp qua một đối tượng javascript đơn giản mà không có Nguyên mẫu, giờ tôi phải xử lý câu trả lời này như thể nó giống như câu hỏi đã bị đóng do "trùng lặp". Vì vậy, ví dụ khủng khiếp vì nó buộc người dùng tải Nguyên mẫu. Người dùng không nói gì về Prototype nên việc buộc họ tải một thư viện không mong muốn là không hữu ích. (hãy nhớ, coi điều này như thể nó thực sự là một bản sao). Nếu câu hỏi khác không bị đóng lại do yêu cầu trùng lặp sai, tôi sẽ không phải bỏ phiếu cho câu trả lời.

2
Người hỏi đã không đề cập đến họ muốn Nguyên mẫu (hoặc câu hỏi đã được chỉnh sửa?)? Dù sao đó là tất cả tốt
emurano

Không cần phải tải một thư viện bên ngoài
Healkiss

553

Ở đây không cần Prototype: JavaScript có for..incác vòng lặp. Nếu bạn không chắc chắn rằng không có ai gây rối Object.prototype, hãy kiểm tra luôn hasOwnProperty(), tức là

for(var prop in obj) {
    if(obj.hasOwnProperty(prop))
        doSomethingWith(obj[prop]);
}

140
Cảm ơn bạn vì câu trả lời thực tế mà không buộc chúng tôi phải tải một thư viện không mong muốn.

8
đây không phải là câu trả lời nghiêm ngặt. câu hỏi nói rằng nguyên mẫu phải được sử dụng! tự do của sự lựa chọn - haha ...
Sven Larson

1
Tiêu đề ban đầu của câu hỏi này đề cập đến Nguyên mẫu, mà tôi đã thêm lại cho rõ ràng. Câu hỏi này, được chứng minh bằng dòng đầu tiên của phần thân, đặc biệt hỏi về một môi trường mà Prototype đang được sử dụng.
OverloadUT

1
Bạn càng viết javascript, càng có nhiều bạn sẽ ghét viết ra forvòng :)
Triptych

13
Thật không may, đây là câu hỏi bật lên số 1 nếu bạn Google cho một cái gì đó như "làm thế nào để lặp qua mọi thuộc tính đối tượng javascript", vì vậy rất nhiều người đến đây thực sự có thể đang tìm kiếm câu trả lời cho câu hỏi này. Câu hỏi họ muốn là câu hỏi này: stackoverflow.com/questions/921789/… , thực sự không liên quan gì đến các ký tự đối tượng.
Baxissimo

0

Bạn nên lặp lại các phím và lấy các giá trị bằng dấu ngoặc vuông.

Xem: Làm cách nào để liệt kê các thuộc tính của một đối tượng javascript?

CHỈNH SỬA: Rõ ràng, điều này làm cho câu hỏi trở nên trùng lặp.


Phương pháp đó hoàn toàn không được khuyến khích trong tài liệu Nguyên mẫu: prototypejs.org/api/array
OverloadUT

1
Ngoài ra, tôi không nghĩ đây là một bản sao vì tôi đang tìm kiếm một giải pháp gốc Nguyên mẫu, đó là những gì tôi có. Một câu hỏi khác là phù hợp cho những người không muốn nó sử dụng một khuôn khổ, nhưng giải pháp này an toàn hơn nhiều nếu bạn đang sử dụng Prototype.
OverloadUT

1
@OverloadUT: bạn đã không đọc kỹ: không khuyến khích lặp lại các thuộc tính của mảng chứ không phải các đối tượng đơn giản
Christoph
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.