2011-05-13 91 views
6

我正在使用ExtJS web應用程序,並正在尋找一種方法來列出對象自己的所有屬性名稱。谷歌搜索,我很快在this blog找到一些參考代碼。現在,當使用這個keys()方法時,當枚舉對象的對象的屬性名稱時,我發現一些奇怪的行爲。示例代碼:在Javascript中查找對象鍵

keys = function(obj) { 
    if (typeof obj != "object" && typeof obj != "function" || obj == null) { 
     throw TypeError("Object.keys called on non-object"); 
    } 
    var keys = []; 
    for (var p in obj) 
     obj.hasOwnProperty(p) && keys.push(p); 
    return keys; 
}; 

var test = {} 
test["nr1"] = {testid: 1, teststr: "one"}; 
test["nr2"] = {testid: 2, teststr: "two"}; 
test["nr3"] = {testid: 3, teststr: "three"}; 
for (var i in keys(test)) { 
    console.log(i); 
} 

當運行該代碼時,控制檯輸出:

0 
1 
2 
remove() 

所以,關於預期的3個屬性名稱的頂部,它還列出了「刪除()」函數。這顯然與ExtJS有關,因爲枚舉在空白的非ExtJS加載頁面上按預期工作。

任何人都可以解釋我ExtJS在這裏做什麼?有沒有更好的方法來枚舉對象自己的屬性名稱?

多謝, wwwald

+7

ExtJS的似乎已經增加了一個功能到Array原型 – 2011-05-13 13:17:02

回答

3

是的,正如@Thai所說,不能用於..in,因爲任何數組都是一個對象,並且在不同的框架中可能會有不同的添加。

keys = function(obj) { 
    if (typeof obj != "object" && typeof obj != "function" || obj == null) { 
     throw TypeError("Object.keys called on non-object"); 
    } 
    var keys = []; 
    for (var p in obj) 
     obj.hasOwnProperty(p) && keys.push(p); 
    return keys; 
}; 

var test = {} 
test["nr1"] = {testid: 1, teststr: "one"}; 
test["nr2"] = {testid: 2, teststr: "two"}; 
test["nr3"] = {testid: 3, teststr: "three"}; 
document.writeln('<pre>'); 
document.writeln('Current method'); 
for (var key in keys(test)) { 
    document.writeln(key); 
} 


document.writeln('Better method1'); 
for (var arr=keys(test), i = 0, iMax = arr.length; i < iMax; i++) { 
    document.writeln(arr[i]); 
} 

document.writeln('Better method2'); 
Ext.each(keys(test), function(key) { 
    document.writeln(key); 
}); 
document.writeln('</pre>'); 
+0

@see http://jsfiddle.net/xaFXR/5/ – gaRex 2011-05-14 11:38:51

+0

啊,現在我明白了。感謝您指出差異。 Ext.each()解決方案看起來很完美! – wwwald 2011-05-16 08:09:17

4

嘗試查看hasOwnProperty到陣列本身,而不是它的原型只有列表屬性。

for (var i in keys(test)) { 
    if(keys(test).hasOwnProperty(i)){ 
     console.log(i); 
    } 
} 
1

keys(test)返回一個數組,所以我們希望你使用經典之作,初始化條件,未來loopm而不是for-in循環。

(function(arr) { 
    for (var i = 0; i < arr.length; i ++) { 
     console.log(i); 
    } 
})(keys(test));