В JavaScript, как я могу вернуть логическое значение, указывающее, присутствует ли ключ в объекте JSON? - PullRequest
3 голосов
/ 22 апреля 2010

У меня довольно простой вопрос: в Javascript, как я могу вернуть логическое значение (если оно найдено в JSON), а не фактическое значение?

Пример:

 var myJSON = { 
                  "foo" : "bar",
                  "bar" : "foo"
              };
 var keyToLookFor = "foo";
 var found = myJSON[keyToLookFor];

 if (found) {
     // I know I can test if the string exists in the if
 }
  // but is there a way I could just return something like:
 return found;
 // instead of testing found in the if statement and then returning true?

Ответы [ 3 ]

8 голосов
/ 22 апреля 2010

Вы должны проверить с ключевым словом «в»:

if (keyToLookFor in myJSON) {
}

Итак, чтобы упростить это, вы можете использовать:

return keyToLookFor in myJSON;
3 голосов
/ 22 апреля 2010

Оператор in может сказать вам, существует ли ключ в объекте или любом из объектов в его цепочке прототипов. Функция hasOwnProperty может сообщить вам, существует ли этот ключ в самом объекте (а не в каком-либо из объектов в его цепочке прототипов).

if ("foo" in obj) {
   // `obj` or an ancestor has a key called "foo"
}

if (obj.hasOwnProperty("foo")) {
   // `obj` has a key called "foo"
}

В вашем примере, на самом деле не имеет значения, какой из них вы использовали, потому что ваш объект просто Object ({} => new Object()), поэтому он не имеет большой части цепочки прототипов. Но это может быть актуально, например, если вы смотрите на пользовательские свойства, которые вы добавили к другим объектам, например:

var a = [1, 2, 3, 4];
a.foo = "testing";

alert("push" in a);              // 1. alerts "true"
alert(a.hasOwnProperty("push")); // 2. alerts "false"
alert("foo" in a);               // 3. alerts "true"
alert(a.hasOwnProperty("foo"));  // 4. alerts "true"

# 1 выше предупреждает true, потому что все массивы наследуют свойство push от Array.prototype (это относится к функции, которая помещает значение в конец массива). # 2 предупреждает false, потому что свойство push взято из прототипа, а не на самом объекте. № 3 и № 4 предупреждают об истинности, поскольку свойство foo существует в самом объекте.

примечание

То, что у вас есть, это не JSON, это буквенная нотация объекта Javascript, подмножеством которой является JSON. Вы использовали литерал (как строковый литерал) для создания объекта и присвоили его переменной. Я упоминаю об этом только потому, что объектные литералы могут содержать больше (включая функции) и иметь более широкий синтаксис. Часть в {} в вашем примере является допустимым JSON, хотя, поскольку вы использовали двойные кавычки как для ключей, так и для значений, нигде не было указано «неопределенное» и не содержало никаких функции. : -)

0 голосов
/ 22 апреля 2010

В вашем примере, если значение свойства равно false, found будет иметь значение false .. даже если оно было найдено, поэтому вы не будете знать, что оно там:)

Если вы хотите продолжить использовать ваш пример (с вышеупомянутой проблемой), вы можете использовать небольшую хитрость:

return !!found;

Который будет преобразовывать найденное в логическое значение.

Я бы выбрал:

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