2013-11-20 2 views
0

Мне нужно проверить, существует ли в объекте несколько конкретных свойств. И для этого у меня есть два вопроса:javascript: проверьте наличие нескольких специфических свойств объекта (также в coffeescript)

  1. Как я обычно должен проверять наличие нескольких существующих свойств в JavaScript?
  2. Есть ли ярлык в CoffeeScript, чтобы сделать это элегантным способом?

Мой Javascript решение будет:

if(obj && obj.pOne && obj.pTwo && obj.pThree) doStuff(); 

В кофе сценарий, который не будет короче:

if obj and obj.pOne and obj.pTwo and obj.pThree then doStuff() 

Не стоит ввести в заблуждение здесь, это не будет работать:

И затем я столкнулся с оператором in, если предложения (которые я никогда не используется для таких проверок). Это правильный способ сделать то, что я хочу достичь? Или это что-то вроде не-go, или есть лучшее/более чистое решение?

Мой код будет выглядеть следующим образом:

if(obj && ('pOne' && 'pTwo' && 'pThree' in obj)) doStuff(); 

и CoffeeScript так:

if obj and ('pOne' and 'pTwo' and 'pThree' of obj) then doStuff() 

+0

!!! НЕ КОПИРОВАТЬ Мое второе предложение ИСПОЛЬЗОВАТЬ ОПЕРАТОР 'in' ВМЕСТЕ С' && 'КОНКАТЕНЦИЯ !!! Я только что нашел вышеупомянутое решение с 'in' совсем не делает того, чего я хочу достичь! Он проверяет только последнее свойство, так как это результат '&&' concatenation. Я должен был это знать ... Кажется, я должен придерживаться первого решения, не так ли? – Dominic

ответ

2

Ваша первая строка - это то, что вы хотите. Нет ничего плохого в этом, как есть. Возможно, подумайте о том, чтобы написать свою функцию по-другому, если вы считаете, что вам нужно проверить 4 вещи перед вызовом функции.

if(obj && obj.pOne && obj.pTwo && obj.pThree) doStuff(); 

Смотреть это: Why Defensive Programming is Rubbish

PS.Твои последние примеры не хорошо и не оценивать так, как вы думаете, что они делают


Рассмотрят переписывание функции, чтобы сделать его лучше использовать

var doStuff = function(obj) { 
    obj  = obj  || {}; 
    obj.pOne = obj.pOne || "pOneDefault"; 
    obj.pTwo = obj.pTwo || "pTwoDefault"; 
    obj.pThree = obj.pThree || "pThreeDefault"; 

    console.log(obj); 
}; 

doStuff(); 
// {pOne: "pOneDefault", pTwo: "pTwoDefault", pThree: "pThreeDefault"} 

doStuff({pOne: "foo"}); 
// {pOne: "foo", pTwo: "pTwoDefault", pThree: "pThreeDefault"} 

doStuff({pTwo: "bar"}); 
// {pTwo: "bar", pOne: "pOneDefault", pThree: "pThreeDefault"} 

doStuff({pTwo: "hello", pThree: "world"}); 
// {pTwo: "hello", pThree: "world", pOne: "pOneDefault"} 
+0

Я согласен с защитой статьи программирования, но здесь она не применяется, поскольку объект, который я получаю, представляет собой анализируемый файл конфигурации от пользователя. И я делаю проверки, чтобы сообщить ему, имеет ли он все необходимые свойства, определенные или прекращают выполнение программы. – Dominic

2

pOne in obj не то же самое, как obj.pOne. Например, для obj = { a: 0 }, a in obj - true, но obj.a - это фальшь.

('pOne' && 'pTwo' && 'pThree' in obj) не означает, что вы думаете; он оценивается как ('pOne' && 'pTwo' && ('pThree' in obj)), что аналогично true && true && ('pThree' in obj).

Хотя многословный, если вы хотите, чтобы поймать разницу между falsy значениями и несуществующими ключами, это еще лучшим способом:

if (obj && 'pOne' in obj && 'pTwo' in obj && 'pThree' in obj) 

Если вы считаете, что свойства могут быть унаследованы, а затем с помощью obj.hasOwnProperty('pOne') вместо 'pOne' in obj еще лучше.

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