2016-12-27 3 views
-1

Я работаю над динамической структурой, в качестве основного примера:Правильный способ проверить, имеет ли динамический объект пустое поле?

var myObj = { 
    "fruits" : { 
    "apples" : { 
     "color" : "red", 
     "price" : "$0.49" 
    } 
    }, 
    "colors" : {} 
}; 

Так я ожидаю, что, например фрукты, «оранжевые» не существует. Я хочу проверить, что он не существует, поэтому я могу добавить его.

Я вижу в консоли, что вам говорят «undefined», если вы пытаетесь получить доступ к «объекту», которого не существует.

Это то, что я ищу, но я не хочу ошибки в консоли, я хочу знать/ожидать, что он пуст, поэтому я могу добавить к нему.

Если я что-то вроде

console.log(myObj.fruits.apples.color); 

Я бы получить красный цвет, так что, если я сделал что оранжевый

console.log(myObj.fruits.orange.color); 

было бы сказать, не определено, по крайней мере, если бы я попытался

console.log(myObj.fruits.apples.weight); 

Это не должно быть неопределенным, мой jsfiddle не делает так жарко, я не могу воспроизвести это неопределенное сообщение console.log в данный момент

Хорошо, поэтому кажется, что при условии существования объекта вы можете проверить неопределенное свойство, например, пример веса.

Я не ищу этого, я ищу, чтобы проверить, существует ли такой объект, как «кокосовый орех», поэтому я могу добавить его в массив объектов, используя расширение. Но я не хочу красную ошибки журнала консоли, я хочу, чтобы быть в состоянии предвидеть его, используя сравнение, как:

if (myObj.fruits.coconut === "undefined") { 
    // means it doesn't exist, add it 
} 

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

+0

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof – deceze

+0

if (myObj.fruits.coconut === void 0) ..... или .. .... if (typeof myObj.fruits.coconut === "undefined") – Kenny

+0

вы должны проверить свойство * first *, которое может не существовать, и если оно должно быть объектом (это ваш случай), то вы можете сделайте это с помощью '!' operator 'if (! myObj.fruits.coconut) myObj.fruits.coconut = {color: 'brown'};' – trincot

ответ

1

вы должны проверить для первого собственности, которые могут не ExI st: поэтому не проверяйте свойство coconut.color, прежде чем вы убедитесь, что существует coconut.

Если свойство вы проверить должен быть объект (который является ваш случай), то вы можете сделать это с помощью оператора !:

if (!myObj.fruits.coconut) myObj.fruits.coconut = { color: 'brown' }; 
0

Если вы хотите проверить на наличие собственности на объект можно использовать Object.prototype.hasOwnProperty():

myObj.fruits.hasOwnProperty("apples") //true 
myObj.fruits.hasOwnProperty("oranges") //false 
+0

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

0

Как кто-то указал в комментариях, у вас есть по крайней мере два пути.

Сначала один, самый простой, просто делает

if(!myObj.fruits.cononut) 
    // do stuff 

Однако это не очень безопасно, так как он «делает питания» даже если .coconut является false, например.

То, что люди, как правило, делает

if(typeof myObj.fruits.cononut === "undefined") 
     // do stuff 

, который проверяет, если поле на самом деле не существует, и не установлен (=== также проверяет для того же типа).

Однако, на этот раз я думаю, что вы когда-либо можно попробовать с этим (не тестировалось глубоко):

if(!("cononut" in myObj.fruits)) 
    // do stuff 

Это проверяет наличие ключа.

EDIT

Как @hackerrdave отметил, вы можете также использовать .hasOwnProperty метод.

+0

Я думаю, что попробую этот метод или то, что hackerrdave упоминается как метод obj.subobj, на самом деле не работал, он работал для этого дело. Не уверен, что пошло не так, но спасибо за варианты. –

+0

На самом деле моя проблема, кажется, использует строку, чтобы попытаться получить доступ к свойству объекта. Hmm –

+0

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

0

Подчеркивание JS содержит _.haslink

_.has (объект, ключ) содержат ли объект данного ключа? Идентичен для object.hasOwnProperty (ключ), но использует безопасную ссылку на функцию hasOwnProperty, если она была случайно переопределена.

_.has({a: 1, b: 2, c: 3}, "b"); 
=> true 

Очевидно, hackerrdave ответ хватай, но если вы используете underscorejs, то это немного проще.

+0

С помощью обычного JavaScript вы уже можете написать 'key в obj'. Кажется, слишком сложно использовать библиотеку для этого и все еще писать что-то, что по крайней мере до тех пор ('_has. (Obj, key)'). – trincot

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