2012-05-23 49 views
13

Cho một mảng JavaScript đối tượng, làm thế nào tôi có thể nhận được khóa và giá trị của từng đối tượng?Nhận khóa và giá trị của đối tượng trong JavaScript?

Đoạn code dưới đây cho thấy những gì tôi muốn làm, nhưng rõ ràng không hoạt động:

var top_brands = [ { 'Adidas' : 100 }, { 'Nike' : 50 }]; 
var brand_options = $("#top-brands"); 
$.each(top_brands, function() { 
    brand_options.append($("<option />").val(this.key).text(this.key + " " + this.value)); 
}); 

Vì vậy, làm thế nào tôi có thể nhận this.keythis.value cho mỗi mục trong mảng?

+0

Bạn đang tìm kiếm 'for ... in', nhưng ngữ nghĩa của vòng lặp của bạn là sai khi nó đứng. – Jon

+1

Nếu đây là những giá trị duy nhất trong các đối tượng, tôi đề nghị thay đổi cấu trúc thành: 'var top_brands = {'Adidas': 100, 'Nike': 50}, ' –

+0

có thể trùng lặp của [Cách nhận tất cả các giá trị thuộc tính của một đối tượng Javascript (không biết khóa)?] (http://stackoverflow.com/questions/7306669/how-to-get-all-properties-values-of-a-javascript-object-without-knowing-the-) –

Trả lời

18

Thay đổi đối tượng của bạn.

var top_brands = [ 
    { key: 'Adidas', value: 100 }, 
    { key: 'Nike', value: 50 } 
]; 

var $brand_options = $("#top-brands"); 

$.each(top_brands, function(brand) { 
    $brand_options.append(
    $("<option />").val(brand.key).text(brand.key + " " + brand.value) 
); 
}); 

Như một quy tắc của ngón tay cái:

  • Một đối tượng có dữ liệucấu trúc.
  • 'Adidas', 'Nike', 10050dữ liệu.
  • Các khóa đối tượng là cấu trúc. Sử dụng dữ liệu làm khóa đối tượng là sai ngữ nghĩa. Tránh nó đi.

Không có ngữ nghĩa trong {Nike: 50}. "Nike" là gì? 50 là gì?

{key: 'Nike', value: 50} tốt hơn một chút, vì bây giờ bạn có thể lặp lại một mảng các đối tượng và giá trị này ở các vị trí có thể dự đoán được. Điều này giúp bạn dễ dàng viết mã để xử lý chúng.

Tốt hơn vẫn là {vendor: 'Nike', itemsSold: 50}, bởi vì hiện tại giá trị không chỉ ở những nơi có thể dự đoán được, chúng còn có tên có ý nghĩa. Về mặt kỹ thuật, đó là điều tương tự như trên, nhưng bây giờ một người cũng sẽ hiểu những giá trị được cho là có ý nghĩa gì.

+0

thêm "khóa" và "giá trị" là không liên quan (và trùng lặp) đặc biệt nếu bạn cần phải vượt qua một loạt điều này trên web. sửa đổi obj là tăng gấp đôi trọng lượng của tổng số json blob ở đây. đơn giản "cho khóa trong đối tượng" hoạt động tốt ở đây. – ekeyser

+0

Trọng lượng của chuỗi JSON là một vấn đề khác. Các đối tượng có dạng dự đoán được và không trộn lẫn cấu trúc và dữ liệu là * cách * dễ dàng hơn để làm việc với mã. '{Nike: 50}' có thể nhỏ hơn, nhưng không có giá trị * ngữ nghĩa *. Ngoài ra 'for .. in' không phải là cách an toàn để lặp các đối tượng và bạn không nên sử dụng nó. – Tomalak

18
$.each(top_brands, function() { 
    var key = Object.keys(this)[0]; 
    var value = this[key]; 
    brand_options.append($("<option />").val(key).text(key + " " + value)); 
}); 
8
$.each(top_brands, function(index, el) { 
    for (var key in el) { 
    if (el.hasOwnProperty(key)) { 
     brand_options.append($("<option />").val(key).text(key+ " " + el[key])); 
    } 
    } 
}); 

Nhưng nếu cấu trúc dữ liệu của bạn là var top_brands = {'Adidas': 100, 'Nike': 50}; thì điều đó sẽ đơn giản hơn nhiều.

for (var key in top_brands) { 
    if (top_brands.hasOwnProperty(key)) { 
     brand_options.append($("<option />").val(key).text(key+ " " + el[key])); 
    } 
} 

Hoặc sử dụng mỗi jquery:

$.each(top_brands, function(key, value) { 
    brand_options.append($("<option />").val(key).text(key + " " + value)); 
}); 
+0

'var key'. –

+0

@FelixKling Có, đã sửa. – xdazz

11

Nếu điều này là tất cả các đối tượng đang xảy ra để lưu trữ, sau đó tốt nhất theo nghĩa đen sẽ là

var top_brands = { 
    'Adidas' : 100, 
    'Nike' : 50 
    }; 

Sau đó, tất cả bạn cần là một for...in vòng lặp.

for (var key in top_brands){ 
    console.log(key, top_brands[key]); 
    } 
0
Object.keys(top_brands).forEach(function(key) { 
    var value = top_brands[key]; 
    // use "key" and "value" here... 
}); 

Btw, lưu ý rằng Object.keysforEach không có sẵn trong các trình duyệt cổ đại, nhưng bạn nên sử dụng một số polyfill anyway.

0
for (var i in a) { 
    console.log(a[i],i) 
} 
Các vấn đề liên quan