2013-12-22 3 views
3

В текстовом приключении я делаю, мои объектные литералы для номеров выглядеть следующим образом:тест, если ключ-имя существует в JavaScript литерал объекта

room : { 
    // some info, 
    exits : { 
    north : -1, 
    east : "house", 
    south : "forest", 
    west : -1 
    } 
} 

и в моей функции, чтобы двигаться вокруг него говорит:

if (room["exits"][direction] !== -1) {// go that way} 
else {print "you can't go that way!"} 

Теперь я хочу сэкономить место, просто проверив, выходит ли ключ для соответствующего направления в объекте. так литералы будут идти:

room : { 
    // some info, 
    exits : { 
    east : "house", 
    south : "forest" 
    } 
} 

... что должно мое if заявление выглядит? каков «правильный» способ выяснить, вызывается ли данное имя ключа в объекте?

+0

Все это похоже на хорошие ответы. Вот связанный с этим вопрос. Что возвращает не-ключевое значение? Т.е.: в приведенном выше примере «var foo = room.exits [bar]' ... is foo null? не определено? –

+0

'room.exits [bar]' будет возвращать 'undefined', если' bar' не существует. '' bar 'in room.exits' вернет 'false'. –

+0

ОК. * Задача вопроса *: можете ли вы указать мне ссылку, которая объясняет null, undefined и falsey (как они применимы в этом контексте), * что у noob был бы шанс понять *? –

ответ

3

Вы можете использовать in operator:

if (direction in room.exits) { 
    // go that way 
} else { 
    console.log("you can't go that way!"); 
} 
+0

Я даю вам +1, поскольку мне не приходило в голову использовать это, но я нашел интересную информацию (размещенную в моем ответе), которая должна быть принята во внимание. – Stephen

+0

@ Stephen +1 для интересного наблюдения. Если бы OP провела миллионы проверок, это было бы большой проблемой. Однако мне кажется, что это не особенно важная часть приложения. Оба решения кажутся совершенно верными. –

+0

Очень правдоподобно, но информация, подобная этой, надеюсь, убирается за дождливый день :) – Stephen

1

вы должны сделать:

if (room.exits.south) {// go that way} 
else {print "you can't go that way!"} 

это все.

Когда «юг» не определено (или когда оно равно нулю или пустая строка или буквальное значение false), предикат оценивается как false.

+0

это отличается от слова room.exits [юг], как предложил Стивен выше? –

+0

Абсолютно никакой разницы в том, как это работает. Разница чисто синтаксическая. – akhikhl

+0

ммм ...из моего собственного эксперимента, я думаю, что разница в том, что скобки принимают переменную. Вы не можете сказать, на взгляд Стивена, room.exits.direction. Однако вы можете сказать room.exits [direction]. –

3

Если нет абсолютно никаких шансов, что он будет пустым, пустая строка, ноль, или любой другой «falsey» значение JS вы можете просто сделать

if(room.exits[direction]) { // go that way } 
else {print "you can't go that way!"} 

Я также сделал тест скорости против " в "операторе, который pswg отправил как ответ, потому что мне никогда не приходило в голову использовать его. Я нашел некоторые интересные результаты, которые вы должны рассмотреть, если вы используете это в любом виде цикла в любой момент.

http://jsperf.com/test-in-operator-vs-if

Похоже, что «в» оператор ЗНАЧИТЕЛЬНО медленнее IE и Chrome, но на Firefox это почти в два раза быстрее.

+0

Хм. Разве это контрастирует с ответом ахихля или просто другим способом поставить его? –

+0

Эх, это почти то же самое - разница в том, что «направление» в моей - переменная, а с ахихлом она устанавливается в коде. Довольно точно, что мы только что сохранили один и тот же код в то же время. – Stephen

+0

Да, я имею в виду использование периода против квадратных фигурных скобок. Притворяясь, что он использовал переменную. –

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