2014-01-25 4 views
0

У меня есть небольшая проблема в Javascript, когда объекты обрабатываются каким-то странным (если не сказать наименьшим образом) способом, если только я чего-то не пропускаю.Ошибка говорит, что «объект имеет значение null», если один из свойств объекта имеет значение null

У меня есть объект с именем state. Когда я console.log(state) я получаю это:

see image please

На данный момент, я стараюсь идти через объект с помощью JQuery-х each:

$.each(state, function (i, sobj) { 
     if(mid == sobj.user_id) 
      //some stuff; 
    }); 

Однако, здесь я получаю сообщение об ошибке говорящее TypeError: sobj is null. Я обнаружил, что это связано с тем, что свойство trump внутри объекта (см. Изображение выше) инициализируется null. При любом другом значении он работает. Очевидно, я могу исправить это, инициализируя его до 0 или что-то в этом роде, но это наводит меня на концептуальный уровень: почему не должно быть разрешено иметь одно из свойств null? Для меня не имеет смысла, что я должен получить сообщение об ошибке, когда весь объект имеет значение null, когда я прохожу через него так, только потому, что одно из свойств имеет значение null. Я не пытался ничего делать с этим свойством.

Итак, может кто-нибудь сказать мне, почему это происходит (Google не помогает), и если есть способ исправить это, кроме очевидного «не позволяйте чему-либо быть нулевым в объекте»?

+0

«Почему одно из свойств не должно иметь нулевое значение?» Ну, свойства * * имеют значение null в качестве значения. Но если одно из свойств имеет нулевое значение, то вы * не * разрешаете получать его 'user_id' (потому что' null' не имеет 'user_id') – Gareth

+0

На мой взгляд, ваш объект' state' должен иметь новое свойство 'seat', которое содержит массив объектов' user'. Затем вы можете перебирать только те, которые не нужны для итерации * все * свойства состояния – Gareth

+0

Будет ли это экономить время по производительности или это всего лишь случай «лучшей практики»? – jovan

ответ

1

Кажется, вы только хотите, чтобы перебирать объекты внутри state объект. Вы можете проверить, является ли объект объектом.

$.each(state, function (i, sobj) { 
    if(typeof(sobj) == "object" && mid == sobj.user_id) 
     //some stuff; 
}); 
+0

Мне действительно нужно только «seat» и «user_id» из 1, 2, 3 и 4 в цикле, остальные объекты вступают в игру позже. – jovan

1

Вы выполняете итерацию по всему объекту, так же как и коллекцию объектов, что означает, что козырь в этом случае является объектом, а не свойством объекта (состояния). Вы либо должны перебирать только по совокупности объектов в состоянии, или испытания, что объект не является нулевым, прежде чем искать значение свойства:

if(typeof(sobj) != 'undefined'){ 
    if(mid == sobj.user_id) 
      //some stuff; 
} 
+0

Я не думаю, что этот подход будет работать, потому что он будет перебирать атрибуты non-object объекта 'sate'. –

+0

Sergio - пример будет работать, он предназначен для выполнения внутри цикла foreach, а не для замены. –

Смежные вопросы