如何在JavaScript中检查对象中是否存在值

如何在JavaScript中检查对象中是否存在值,javascript,angularjs,object,Javascript,Angularjs,Object,我的angular factory服务中有一个函数来获取一些数据。在使用对象之前,如何检查对象内部是否存在某个值 这就是我一直在尝试的 categories.fetch = function(app){ if(!app.subject.name.length){ return false; } var p = Restangular.all('v1/categories').getList({app.subject.name.toUpperCase()}); } 因此,我只

我的angular factory服务中有一个函数来获取一些数据。在使用对象之前,如何检查对象内部是否存在某个值

这就是我一直在尝试的

categories.fetch = function(app){
  if(!app.subject.name.length){
    return false;
  }
  var p = Restangular.all('v1/categories').getList({app.subject.name.toUpperCase()});
}
因此,我只想在
restanguar
调用中使用
app.subject.name
之前检查一下它是否有值


感谢

您的代码将检索长度属性的值,并尝试将其转换为布尔值,以便进行
if/then
测试,但如果该值恰好为
null
,则会引发错误

此外,如果您的测试只是:
app.subject.name
,那么如果该值恰好是一个虚假的值,例如
0
false
,则您将得到一个假阳性,这两个值都是完全有效的值

对于字符串,最简单的测试是检查非空字符串和非空字符串。如果该值是由最终用户提供的,最好首先调用字符串上的
.trim()
,以删除可能无意中添加的任何前导或尾随空格

var myObj={
测试:0,
测试:空
}
//当值为空时,此操作将失败并出现错误
/*
if(myObj.testing.length){
log(“测试属性有一个值。”);
}否则{
log(“测试属性没有值。”);
}
*/
//当值为falsy时,这将返回假阳性
if(myObj.test){
log(“测试属性有一个值。”);
}否则{

console.log(“test属性没有值”);//您的代码将检索length属性的值,并尝试将其转换为布尔值,以便执行
if/then
测试,但如果该值恰好为
null
,则会引发错误

此外,如果您的测试只是:
app.subject.name
,那么如果该值恰好是一个虚假的值,例如
0
false
,则您将得到一个假阳性,这两个值都是完全有效的值

对于字符串,最简单的测试是检查非空字符串和非空字符串。如果值是由最终用户提供的,最好先调用字符串上的
.trim()
,以删除可能无意中添加的任何前导或尾随空格

var myObj={
测试:0,
测试:空
}
//当值为空时,此操作将失败并出现错误
/*
if(myObj.testing.length){
log(“测试属性有一个值。”);
}否则{
log(“测试属性没有值。”);
}
*/
//当值为falsy时,这将返回假阳性
if(myObj.test){
log(“测试属性有一个值。”);
}否则{
log(“测试属性没有值。”);//
方法返回一个布尔值,指示对象是否具有指定的属性

范例

var priceOfFood = {
    pizza: 14,
    burger 10
}

priceOfFood.hasOwnProperty('pizza') // true
priceOfFood['pizza'] // 14
priceOfFood.hasOwnProperty('chips') // false
priceOfFood['chips'] // undefined
方法返回一个布尔值,指示对象是否具有指定的属性

范例

var priceOfFood = {
    pizza: 14,
    burger 10
}

priceOfFood.hasOwnProperty('pizza') // true
priceOfFood['pizza'] // 14
priceOfFood.hasOwnProperty('chips') // false
priceOfFood['chips'] // undefined
简单地说:

if(!app.subject.name){
        return ;
    }
简单地说:

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

我知道这个问题并没有问关于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 (_.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()});
}

我知道这个问题并没有问关于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 (_.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()});
}


但是长度属性0是错误的,因此
!object.length
只是检查它是否为
>0
的一个快捷码。如果
名称
应用程序.subject
上根本不存在,这也会引发
未定义的
类型错误
。当然,这会在您检查属性时发生它不存在。这就像说
sdlfj=894#$@$%$.[]{}{
将抛出语法错误。@Connum由于属性可能为
null
length
不应使用,因为在这种情况下它将抛出错误。但是length属性0是错误的,因此
!object.length
只是检查它是否为
>0
的一个快捷码,这也将如果
name
app.subject
上根本不存在,则抛出
undefined
TypeError
。当然会。这将在您检查不存在的属性时发生。这就像说
sdlfj=894#$@$%$.[]{}{
将抛出语法错误。@Connum由于属性可能为
null
length
不应使用,因为在这种情况下它将抛出错误。这如何帮助检查属性是否有值。问题不是如何检查属性是否存在。这是一个类比解释。我认为OP要求的不是检查一个值,而是一个键。OP非常清楚地说:“所以我只想在重启调用之前检查app.subject.name中是否有值。”这有助于检查属性是否有值。问题不是如何检查属性是否存在。这是一种类比解释。我认为OP的问题不是检查值,而是检查键。OP非常清楚地说:“所以我只想在restanguar调用中使用app.subject.name之前检查app.subject.name中是否有值。”正如我在其他几个答案中所指出的,如果值是像0或false这样的假值,这将抛出一个假阳性,这两个值都是有效值。它不会出现在
if
语句中,因为输入值是字符串,因为表达式“0”或“false”在
if
语句中是
true
,这取决于测试被写入。
if(“0”==tr