Поиск ключей объекта в Javascript - PullRequest
6 голосов
/ 13 мая 2011

Я работаю над веб-приложением ExtJS и искал способ перечислить все собственные имена свойств объекта.Погуглив, я быстро нашел код ссылки в этом блоге .Теперь, при использовании этого метода keys (), я обнаружил странное поведение при перечислении имен свойств объектов объектов.Пример кода:

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()

Таким образом, помимо ожидаемых трех имен свойств, она также выводит список «remove ()»функция.Это явно связано с ExtJS, потому что перечисление работает, как и ожидалось, на пустой странице загрузки, отличной от ExtJS.

Может кто-нибудь объяснить мне, что именно ExtJS делает здесь?Есть ли лучший способ для перечисления имен собственных свойств объекта?

Спасибо большое, wwwald

Ответы [ 3 ]

4 голосов
/ 13 мая 2011

Попробуйте установить hasOwnProperty, чтобы перечислять только свойства самого массива, а не его прототипа.

for (var i in keys(test)) {
    if(keys(test).hasOwnProperty(i)){
      console.log(i);
    }
}
3 голосов
/ 14 мая 2011

Да, как сказал @Thai, не используйте for..in, так как любой массив является объектом и потенциально может иметь различные дополнения в разных средах.

<code>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('
');
1 голос
/ 13 мая 2011

keys(test) возвращает массив, поэтому вы должны использовать классический цикл for-init-condition-next, а не цикл for-in.

(function(arr) {
    for (var i = 0; i < arr.length; i ++) {
        console.log(i);
    }
})(keys(test));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...