2008-11-04 69 views

Trả lời

-1

Điều này sẽ hoạt động với JSON. Nó chưa được thử nghiệm nhiều:

<style> 
.tree { 
    margin-left:5px; 
} 
</style> 
<div id='out'></div> 
<script type="text/javascript"> 
data = {"feep":{"bar":{"baz":"37628","quux":{"a":"179","b":"7"}},"foo":"1025"},"Bleh":"1234"} 
$('out').innerHTML = renderJSON(data) 

function renderJSON(obj) { 
    var keys = [] 
    var retValue = "" 
    for (var key in obj) { 
     //$('out').innerHTML = $('out').innerHTML +"<br />" + key + ", " + obj[key]  
     if(typeof obj[key] == 'object') { 
      retValue += "<div class='tree'>" + key      
      retValue += renderJSON(obj[key]) 
      retValue += "</div>" 
     } 
     else { 
      retValue += "<div class='tree'>" + key + " = " + obj[key] + "</div>" 
     } 

     keys.push(key) 
    } 
    return retValue 

} 
</script> 
0

Khi bạn nói "thuộc tính dựng sẵn", bạn thiết lập chính xác thuộc tính nào?

Từ Douglas Crockford 'JavaScript - The Good Parts':

Các định trong tuyên bố có thể lặp qua tất cả trong những cái tên sở hữu trong một đối tượng. Việc liệt kê sẽ bao gồm tất cả các thuộc tính — bao gồm các chức năng và các thuộc tính nguyên mẫu mà bạn có thể không quan tâm — do đó, nó là cần thiết để lọc ra các giá trị mà bạn không muốn. Các bộ lọc phổ biến nhất là phương pháp hasOwnProperty và sử dụng typeof để loại trừ các chức năng:

var name; 
for (name in another_stooge) 
{ 
    if (typeof another_stooge[name] !== 'function') { 
     document.writeln(name + ': ' + another_stooge[name]); 
    } 
} 
+0

Trường hợp sử dụng cụ thể của tôi là liệt kê các phương thức tích hợp cho Array.prototype. Từ tham chiếu javascript lõi MDC: "Vòng lặp for ... trong vòng lặp không lặp qua các thuộc tính tích hợp". Vòng lặp đơn giản nào trên Array.prototype xác nhận. –

5

Câu trả lời là không. Bạn không thể liệt kê các thuộc tính không đếm được. Tuy nhiên, có ít nhất hai cách xung quanh điều này.

Đầu tiên là tạo tất cả các tổ hợp ký tự có thể dùng làm tên thuộc tính thử nghiệm (suy nghĩ: a, b, c, ... aa, ab, ac, quảng cáo, ...). Do cộng đồng tiêu chuẩn nổi tiếng với các tên phương thức thực sự dài (getElementsByTagNames, propertyIsEnumerable) nên phương pháp này sẽ đòi hỏi một số kiên nhẫn. :-)

Cách tiếp cận khác là kiểm tra các thuộc tính gốc đã biết từ một số danh sách được xác định trước.

Ví dụ: Đối với một array bạn sẽ thử nghiệm cho tất cả các thuộc tính tự nhiên nổi tiếng của Function.prototype:

prototype caller constructor length name apply call toSource toString valueOf toLocaleString 

... và những thứ thừa hưởng từ Object.prototype:

__defineGetter__ __defineSetter__ hasOwnProperty isPrototypeOf __lookupGetter__ 
__lookupSetter__ __noSuchMethod__ propertyIsEnumerable unwatch watch 

... và những thứ thừa hưởng từ Array:

index input pop push reverse shift sort splice unshift concat join slice indexOf lastIndexOf 
filter forEach every map some reduce reduceRight 

..và cuối cùng, và tùy chọn, mỗi tài sản đếm được của các đối tượng bạn đang thử nghiệm:

for (var property in myArrayObject) myPossibleProperties.push(property); 

Sau đó bạn sẽ có thể kiểm tra mỗi một trong những để xem nếu họ có mặt trên trường hợp đối tượng.

Điều này sẽ không tiết lộ các thành viên không được liệt kê không xác định (không có giấy tờ hoặc được đặt bởi các tập lệnh khác), nhưng sẽ cho phép bạn liệt kê những thuộc tính gốc nào có sẵn.

Tôi tìm thấy thông tin về các thuộc tính gốc Array trên Mozilla Developer CenterMSDN.

-1

Không, bạn không thể liệt kê các thuộc tính tích hợp của đối tượng. Nhưng bạn có thể tham khảo tài liệu tham khảo của người thực hiện. Ví dụ: để biết tất cả các phương pháp và thuộc tính của đối tượng Math được triển khai trên firefox, bạn sẽ sử dụng Tham chiếu Javascript của Firefox: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Math

17

Tôi nhận ra câu hỏi này là ba tuổi, nhưng bây giờ, với ES5, có thể :

>>> Object.getOwnPropertyNames(Object)

["prototype", "getPrototypeOf", "getOwnPropertyDescriptor", "keys", "defineProperty", "defineProperties", "create", "getOwnPropertyNames", "isExtensible", "preventExtensions", "freeze", "isFrozen", "seal", "isSealed", "length", "arity", "name", "arguments", "caller"]

+3

Để làm rõ một chút, Object.getOwnPropertyNames (Array) cung cấp các thuộc tính dựng sẵn cho Array. – forforf

Các vấn đề liên quan