2017-02-13 2 views
1

У меня есть функция в моей угловой заводской службе для получения некоторых данных. Как проверить, существует ли какое-либо значение внутри объекта перед его использованием?Как проверить, существует ли значение в объекте в JavaScript

вот что я пытался ...

categories.fetch = function(app){ 
    if(!app.subject.name.length){ 
    return false; 
    } 
    var p = Restangular.all('v1/categories').getList({app.subject.name.toUpperCase()}); 
} 

, так что я просто хочу, чтобы проверить, что есть ценность в app.subject.name перед его использованием в restanguar вызова ...

Благодарности

ответ

2

Ваш код будет извлекать значение свойства length и попытаться преобразовать его в логическое значение для целей теста if/then, но это вызовет ошибку, если значение будет null.

Кроме того, если ваш тест просто: app.subject.name, вы получите ложный положительный результат, если значение случается, falsy значение, как 0 или false, которые оба являются совершенно допустимыми значениями.

С помощью строчек простейшим тестом является проверка непустой строки и непустой. Если это значение было предоставлено конечным пользователем, рекомендуется сначала вызвать .trim() в строке, чтобы удалить любые начальные или конечные пробелы, которые могут быть случайно добавлены.

var myObj = { 
 
    test : 0, 
 
    testing : null 
 
} 
 

 

 
// This will fail with an error when the value is null 
 
/* 
 
if(myObj.testing.length){ 
 
    console.log("The testing property has a value."); 
 
} else { 
 
    console.log("The testing property doesn't have a value."); 
 
} 
 
*/ 
 

 
// This will return a false positive when the value is falsy 
 
if(myObj.test){ 
 
    console.log("The test property has a value."); 
 
} else { 
 
    console.log("The test property doesn't have a value."); // <-- Incorretly reports this 
 
} 
 

 
// This explicit test will pass and fail correctly 
 
if(myObj.testing !== "" && myObj.testing !== null){ 
 
    console.log("The testing property has a value."); 
 
} else { 
 
    console.log("The testing property doesn't have a value."); 
 
}

Кроме того, если значение есть, поместите код в if правда отрасли и не беспокоиться о return false.

categories.fetch = function(app){ 
    if(app.subject.name !== "" && app.subject.name !== null) { 
    var p = 
     Restangular.all('v1/categories').getList({app.subject.name.toUpperCase()}); 
    } 
+2

Но свойство length из 0 является ложным, поэтому '! Object.length' - это всего лишь короткий код для проверки того, является ли это'> 0' – Connum

+0

. Это также вызовет 'undefined'' TypeError' в случае, если 'name' doesn 't существует на 'app.subj ect'. – Pineda

+1

Конечно, будет. Это произойдет в любое время, когда вы проверите свойство, которого не существует. Это как сказать, что 'sdlfj = 894 # $ @ $% $. [] {} {' Будет вызывать синтаксическую ошибку. –

1

Метод hasOwnProperty() возвращает логическое значение, указывающее, имеет ли объект указанное свойство. MDN Docs

Пример

var priceOfFood = { 
    pizza: 14, 
    burger 10 
} 

priceOfFood.hasOwnProperty('pizza') // true 
priceOfFood['pizza'] // 14 
priceOfFood.hasOwnProperty('chips') // false 
priceOfFood['chips'] // undefined 
+2

Как это помогает проверить, имеет ли свойство значение. Вопрос не в том, как проверить, существует ли свойство. –

+0

Это объяснение по аналогии. Я думаю, что ОП просит не проверять значение, а ключ. –

+2

OP довольно четко говорит: * «так что я просто хочу проверить, есть ли значение в app.subject.name, прежде чем использовать его в вызове restagnar» * –

0

Простой, как:

if(!app.subject.name){ 
     return ; 
    } 
+0

Как я уже говорил на нескольких других ответах, это будет бросать ложное положительное значение, если значение является ложным значением, равным 0 или false, которые являются действительными значениями. –

+0

Он не попадет в оператор 'if', поскольку входное значение является строкой, потому что выражение '0' или 'false' являются' истинными' в операторе 'if' – Korte

+0

Это зависит от того, как написано тест. 'if (" 0 "== true) {}' приводит к 'false', тогда как' if ("0") {} 'приводит к' true'. –

1

Я знаю, вопрос не спросить о Lodash, но мне удается сделать этот вид проверки много с ним и он работает безупречно. В вашем случае это будет что-то вроде этого:

categories.fetch = function(app){ 
    if (_.isEmpty(app.subject.name)) { 
    return false; 
    } 
var p = Restangular.all('v1/categories').getList({app.subject.name.toUpperCase()}); 
} 

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

categories.fetch = function(app){ 
    if (_.isEmpty(_.get(app, "subject.name"))) { 
    return false; 
    } 
var p = Restangular.all('v1/categories').getList({app.subject.name.toUpperCase()}); 
} 

Или просто:

categories.fetch = function(app){ 
    if (!_.get(app, "subject.name")) { 
    return false; 
    } 
var p = Restangular.all('v1/categories').getList({app.subject.name.toUpperCase()}); 
} 
+1

Что делать, если 'app.subject.name ===" "'? –

+1

У вашего «безупречного» ответа есть недостаток: https://plnkr.co/edit/2sRu0U4hbOIdVnayW5EP –

+0

Я не вижу там никакой проблемы, не могли бы вы перепроверить его '_.isEmpty (data.career.field)' return true as должен быть. – Shota

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