2009-03-23 29 views
109

Giả sử bạn có một đối tượng javascript như thế này:Làm cách nào để truy cập các thuộc tính của đối tượng javascript nếu tôi không biết tên?

var data = { foo: 'bar', baz: 'quux' }; 

Bạn có thể truy cập vào các tính chất của các tên thuộc tính:

var foo = data.foo; 
var baz = data["baz"]; 

Nhưng là nó có thể để có được những giá trị này nếu bạn không biết tên của các thuộc tính? Liệu bản chất không có thứ tự của những đặc tính này làm cho nó không thể phân biệt chúng?

Trong trường hợp của tôi, tôi đang suy nghĩ cụ thể về một tình huống mà một hàm cần chấp nhận một loạt các cặp giá trị tên, nhưng tên của các thuộc tính có thể thay đổi.

Suy nghĩ của tôi về cách thực hiện điều này cho đến nay là chuyển tên của thuộc tính cho hàm cùng với dữ liệu, nhưng điều này giống như một hack. Tôi muốn làm điều này với nội tâm nếu có thể.

Trả lời

46

phiên bản cũ của JavaScript (< ES5) đòi hỏi phải sử dụng một vòng lặp for..in:

for (var key in data) { 
    if (data.hasOwnProperty(key)) { 
    // do something with key 
    } 
} 

ES5 giới thiệu Object.keysArray#forEach mà làm điều này một chút dễ dàng hơn:

var data = { foo: 'bar', baz: 'quux' }; 

Object.keys(data); // ['foo', 'baz'] 
Object.keys(data).map(function(key){ return data[key] }) // ['bar', 'quux'] 
Object.keys(data).forEach(function (key) { 
    // do something with data[key] 
}); 

ES2017 giới thiệu Object.valuesObject.entries.

Object.values(data) // ['bar', 'quux'] 
Object.entries(data) // [['foo', 'bar'], ['baz', 'quux']] 
+1

Bây giờ điều này thực sự trả lời câu hỏi, cũng được thực hiện @Adam Lassek, rất độc đáo thực hiện. –

+0

Việc gây hiểu nhầm là sử dụng cả 'tên' và 'giá trị' làm khóa đối tượng. Hàm này chỉ trả về các khóa trong danh sách chứ không trả về các giá trị. {name1: 'value1', name2: 'value2'} sẽ tránh nhầm lẫn cho người mới bắt đầu. Object.keys (dữ liệu); // ['name1', 'name2'] –

+2

@JamesNicholson Tôi đồng ý, chỉnh sửa để ít gây nhầm lẫn. –

10
for(var property in data) { 
    alert(property); 
} 
127

Bạn có thể lặp qua các phím như thế này:

for (var key in data) { 
    console.log(key); 
} 

này sẽ ghi lại "Tên" và "giá trị gia tăng".

Nếu bạn có một loại đối tượng phức tạp hơn (không chỉ là một đối tượng dạng băm đơn giản, như trong câu hỏi gốc), bạn sẽ chỉ muốn lặp qua các khóa thuộc về đối tượng, trái với các phím trên của đối tượng là prototype:

for (var key in data) { 
    if (data.hasOwnProperty(key)) { 
    console.log(key); 
    } 
} 

Như bạn đã lưu ý, các khóa không được đảm bảo theo bất kỳ thứ tự cụ thể nào. Lưu ý cách này khác với những điều sau đây:

for each (var value in data) { 
    console.log(value); 
} 

Ví dụ này vòng qua giá trị, vì vậy nó sẽ đăng nhập Property Name0. N.B .: Cú pháp for each chủ yếu chỉ được hỗ trợ trong Firefox, nhưng không được hỗ trợ trong các trình duyệt khác.

Nếu trình duyệt mục tiêu của bạn hỗ trợ ES5, hoặc trang web của bạn bao gồm es5-shim.js (recommended), bạn cũng có thể sử dụng Object.keys:

var data = { Name: 'Property Name', Value: '0' }; 
console.log(Object.keys(data)); // => ["Name", "Value"] 

và vòng lặp với Array.prototype.forEach:

Object.keys(data).forEach(function (key) { 
    console.log(data[key]); 
}); 
// => Logs "Property Name", 0 
+0

Bạn vừa thực hiện điều cuối cùng và thực sự đã bỏ qua nó? Thực hiện tốt ... =) –

+0

Điều này tồn tại trong Firefox ([tài liệu] (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/for_each...in)), nhưng điểm công bằng rằng nó không phổ biến. Tôi sẽ cập nhật câu trả lời để đề cập đến điều này. –

+25

cảnh báo btw là một cách xấu để gỡ lỗi mọi thứ, hãy thử console.log – StackOverflowed

4

Bạn thường sẽ muốn kiểm tra các đặc tính cụ thể của một thể hiện của một đối tượng, mà không cần tất cả các phương thức và đặc tính nguyên mẫu được chia sẻ của nó:

Obj.prototype.toString= function(){ 
     var A= []; 
     for(var p in this){ 
      if(this.hasOwnProperty(p)){ 
       A[A.length]= p+'='+this[p]; 
      } 
     } 

    return A.join(', '); 
} 
0
var fs = require("fs"); 

fs.stat(process.argv[1], function(err, stats){ 
if (err) { 
    console.log(err.message); 
    return;  
} else { 
console.log(JSON.stringify(stats)); 

/* this is the answer here */ 

    for (var key in Object.keys(stats)){ 
    var t = Object.keys(stats)[key]; 
    console.log(t + " value =: " + stats[t] ); 
    } 

/* to here, run in node */ 
    } 
}); 
+0

Bạn có thể thêm giải thích thêm không? –

+0

'Object.keys (stats) [key]' không có ý nghĩa, sẽ luôn là 'undefined'. –

-2
var attr, object_information=''; 

for(attr in object){ 

     //Get names and values of propertys with style (name : value) 
     object_information += attr + ' : ' + object[attr] + '\n'; 

    } 


alert(object_information); //Show all Object 
+0

Điều này không thêm gì vào câu trả lời được chấp nhận và trình bày thông tin theo cách ít hữu ích nhất có thể. Và nó không tính đến các thuộc tính kế thừa. –

2
function getDetailedObject(inputObject) { 
    var detailedObject = {}, properties; 

    do { 
     properties = Object.getOwnPropertyNames(inputObject); 
     for (var o in properties) { 
      detailedObject[properties[o]] = inputObject[properties[o]]; 
     } 
    } while (inputObject = Object.getPrototypeOf(inputObject)); 

    return detailedObject; 
} 

này sẽ nhận được tất cả các thuộc tính và giá trị của họ (được thừa kế hoặc riêng, đếm được hay không) trong một đối tượng mới. đối tượng gốc bị ảnh hưởng. Bây giờ đối tượng mới có thể được duyệt qua bằng cách sử dụng

var obj = { 'b': '4' }; //example object 
var detailedObject = getDetailedObject(obj); 
for(var o in detailedObject) { 
    console.log('key: ' + o + ' value: ' + detailedObject[o]); 
} 
Các vấn đề liên quan