2015-04-24 2 views
1

У меня была интересная ситуация, и мне было интересно, знает ли кто-нибудь почему. я имел это заявление в своем кодеДоступ к объекту недвижимости в массиве в тройном

var score = (typeof k.rewards !== 'undefined') ? k.rewards[0].value : k.value; 

Это выдаст ошибку значения будучи неопределенным в массиве (на truthy стороны тройного). Тем не менее, я знаю, что ценность там, и это будет печатать ее просто отлично.

var score = (typeof k.rewards !== 'undefined') ? k.rewards : k.value; 
Console.log(score[0].value); 

Кто-нибудь знает, почему это было бы неопределенным, когда я попытаюсь получить к нему доступ прямо в тройной?

+0

Вы могли бы добавить код для создания массива? –

+0

Не могли бы вы показать тип и структуру вознаграждений? – Ninir

+0

Этого не должно быть, https://jsfiddle.net/1wmefa6p/ – Vic

ответ

1

Ну, ваше первое выражение эквивалентно

(typeof k.rewards !== 'undefined' ? k.rewards[0] : k).value 

в то время как ваш второй один эквивалентно

(typeof k.rewards !== 'undefined' ? k.rewards : k.value)[0].value 

Я надеюсь, что вы можете увидеть разницу сейчас ...

Это будет вывести ошибку значения, которая не определена в массиве (на правдивой стороне тройки).

Не совсем. Ваш первый бросает, когда k.rewards[0] является undefined, и вы тем не менее пытаетесь получить доступ к его .value. Если k.rewards[0] существовал, но не имел .value собственности, он бы не бросил, а просто дал undefined. Возможно, вы захотите пройти тест на k.rewards.length > 0, а также в вашем состоянии:

(k.rewards && k.rewards.length ? k.rewards[0] : k).value 
+0

ok, но оба они имеют значение. вышеуказанное заявление должно работать. Я получаю удаленные данные, и структура может быть либо k.rewards [0] .value, либо k.value. Это может быть проблемой – TDmoneybanks

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