JavaScript для цикла, возвращающего ключ "indexof" - PullRequest
0 голосов
/ 25 ноября 2011

У меня есть некоторый JavaScript, как показано ниже

for (var titleKey in data.d) {
  var title = data.d[titleKey];
}

Это на самом деле возвращается из вызова JQuery в веб-сервис .NET, но я не верю, что это связано.

Мой циклитерирует по каждому элементу в коллекции правильно, затем продолжает цикл еще раз.Здесь titleKey - indexof, а title - undefined.

Это происходит в двух разных местах в моем коде.

Что вызывает это?Как я могу предотвратить это?

Заранее спасибо.

Ответы [ 5 ]

5 голосов
/ 25 ноября 2011

Необходимо исключить из цикла свойства прототипа.Структура for ... in будет проходить через все *, которые он находит в цепочке прототипов, а не только свойства дочернего объекта.

for (var titleKey in data.d) {
  if (data.d.hasOwnProperty(titleKey)) {
    // own property //
  }
  else {
    // inherited property //
  }
}

Из того, что в журнале консоли говорится, что у меня есть подозрение, что у вас есть библиотека, котораяреализует indexof для массива в своем прототипе.

Я бы рекомендовал использовать правильный способ для обхода массивов:

for (var index = 0; index < data.d.length; index++) {...}

for in для объектов, а не массивов. Это распространенная ошибка новичка, когда кто-то злоупотребляет тем фактом, что Array является производным от Object.

* См. Комментарий от davidchambers

2 голосов
/ 25 ноября 2011

Используйте следующий механизм цикла:

for (var i = 0; i < titleKey.length; i++) {
  var title = data.d[titleKey[i]];
}

Цикл for: in циклически просматривает все свойства объекта, а не только те, которые индексируются.

2 голосов
/ 25 ноября 2011

Javascript «for-in» перебирает все свойства объекта, включая имена методов.

1 голос
/ 25 ноября 2011

Если indexof происходит из цепочки прототипов, вы должны использовать hasOwnProperty, чтобы пропустить его.

for (var titleKey in data.d) {

    if (data.d.hasOwnProperty(titleKey))
    {
      var title = data.d[titleKey];
    }

}
0 голосов
/ 25 ноября 2011

На основании имеющейся информации я бы сказал, что data.d.indexof на самом деле undefined.Ниже приведена совершенно правильная структура данных:

foo: 42
bar: [1, 2, 3]
baz: false
indexof: undefined

Для проверки работоспособности попробуйте следующее:

console.log(Object.prototype.hasOwnProperty.call(data.d, 'indexof'))

Редактировать: Теперь, когда все стало ясночто структура данных на самом деле является массивом, этот ответ не решает проблему ОП.Это все еще действует, поэтому я не буду удалять его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...