Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何遍历JavaScript对象并检查空值?_Javascript_Isnull - Fatal编程技术网

如何遍历JavaScript对象并检查空值?

如何遍历JavaScript对象并检查空值?,javascript,isnull,Javascript,Isnull,假设我有一个JavaScript对象,如: var obj = {}; obj.computers = {}; obj.computers.favorite = "Commodore 64"; obj.computers.popular = "Apple"; 现在,我可以轻松地检查空值,如: if(obj != 'undefined' && obj != null) { if(obj.computers != 'undefined' && obj.com

假设我有一个JavaScript对象,如:

var obj = {};
obj.computers = {};
obj.computers.favorite = "Commodore 64";
obj.computers.popular = "Apple";
现在,我可以轻松地检查空值,如:

if(obj != 'undefined' && obj != null) {
    if(obj.computers != 'undefined' && obj.computers != null)) {
        .....
如您所见,如果我需要查看是否设置了
obj.computers.favorite
,我必须在那里嵌套一些条件逻辑。我们的一些物体有3、4、5层深

这就是我希望能够做到的:

var fav = obj.computers.favorite || 'Unknown';
但我意识到我需要用某种方法来包装它。比如:

var fav = getValueOrDefault(obj.computers.favorite, 'Unknown');
欢迎提出建议

谢谢

编辑

我对“未定义”的检查实际上不是我使用的。当我问这个问题的时候,我突然想到了。哈哈

但我想知道,我是否可以只使用try/catch并在异常时抛出default

function(obj, default) {
    try {
        if(obj != null) {
            return obj;
        } else {
            return default;
        }
    } catch(ex) {
        return default;
    }
}
另外,感谢Shusi指出了冗余变量。

您确实可以编写:

(obj && obj.computers && obj.computers.favorite) || 'Unknown'

下面的函数将字符串作为参数,并返回对象(如果存在)

 function getValueOrDefault(str , obj, deflt){
    var a = str.split("."); o = obj;
    for(var i =0; i < a.length; i++){
         o = obj[a[i]];
         if(!o){
           return deflt;
         }
    }
      return o;
}

var obj = {};
obj.computers = {};
obj.computers.favorite = "Commodore 64";
obj.computers.popular = "Apple";
getValueOrDefault('computers.favorite', obj, 'Unknown');
函数getValuerDefault(str、obj、deflt){ var a=str.split(“.”);o=obj; 对于(变量i=0;i
注意:为对象分配属性时不得使用var,例如
var obj.computers。最常用的
是语法错误

不幸的是,没有一种非常简单的方法可以解决这个问题,但是您不需要同时检查null和undefined。因为null和undefined都是错误的,所以您可以执行以下操作:

if (obj && obj.computers) {
  var fav = obj.computers.favorite || 'unknown';
}
它实际上并不能解决你的抱怨是什么,但它比你想象的痛苦要小。

你可以用助手功能来解决。如果我正确理解了您的问题,您的对象可能具有任意深度对象,并且您希望访问这些任意嵌套属性而不会使代码混乱。我构建了一个
Nested
函数,如果设置了
get()
任意属性,则可以使用该函数;如果没有设置,则可以使用默认值

var Nested = function() {};
// prop is a dot-separated path like "foo.bar.baz"
Nested.prototype.get = function(prop, _default) {
    var current = this;
    $.each(prop.split("."), function(i, e) {
        current = current[e] || undefined;
        if (current == undefined)
            return false;
    });
    return current || _default;
}
然后您可以编写这样的代码

var fav = obj.get("computers.favourite", "Linux");
// this emulates
var fav = obj.computers.favourite || "Linux"; // throws error

正如你所看到的,这并不是更多的打字。当然,感觉不像是普通的Javascript

我写这篇文章是为了帮助您解决您的一个问题:“我需要看看obj.computers.favorite是否已设置”

您也可以使用JavaScript ES5
reduce
函数实现这一点:

function get(root, member) {
    return member.split('.').reduce((acc, value) => {
        return (acc && typeof acc[value] !== 'undefined') ? acc[value] : undefined
    }, root);
}
它从成员字符串中生成一个数组,然后累加器随着成员的减少在对象中逐步遍历

即使使用阵列,也可以这样使用:

let obj = {
    computers : {
        favorite : "Commodore 64",
        popular : "Apple",
        list: [
            {
                sn : "TDGE52343FD76",
                price: "9867.99",
                options: {
                    fanless: true
                }
            }
        ]
    }
}

get(obj, 'computers.popular');
// => "Apple"
get(obj, 'computers.list.0.sn');
// => "TDGE52343FD76"
get(obj, 'computers.list.0.options.fanless');
// => true
get(obj, 'computers.list.0.options.runsWithoutEletricity');
// => undefined
get(obj, 'computers.list.0.options.runsWithoutEletricity') || "too bad..." ;
// => "too bad..."
有一个代码笔

是处理此问题的最新方法:

let favorite = obj?.computers?.favorite;
结合这一点,您可以精确地执行最初请求的操作:

let favorite = obj?.computers?.favorite ?? 'Unknown';

请注意,这两个操作符都还没有得到普遍支持。

obj!='未定义的'&&obj!=null不正确,因为要获取字符串值
“未定义”
,需要typeof。这是一个常见的错误。但无论如何,这都是不必要的冗长。只需执行
obj!=null
,它将同时测试
未定义
getValueOrDefault(obj.computers.favorite,'Unknown')
将在未定义
obj.computers
时引发异常。您必须将其包装成字符串并进行增量对象解析。@saml完全正确。这正是我想要避免的。我们的JS对象有时非常深入。我想我可以做一个try/catch并在异常时返回默认值?可选链接是您想要的,我想您可以交换
obj
deflt
参数并更改
o=obj |窗口
。因此,您可以编写
getValueOrDefault('obj.computers.favorite','unknown')
是的,您是对的。但这个解决方案更具体地针对上述问题。呃,您需要将var声明更改为
var current=this和在代码中
current=current[e]| |未定义。然后小提琴会正常工作。您应该提到您的答案需要jquery.+1,但请参阅我对一个通用解决方案的回答,该解决方案不会使代码中出现许多
s,并且如果OP多次使用此模式,它会更有用。这与PHP isset不同,因为对于null和未定义,它会返回true。
let favorite = obj?.computers?.favorite;
let favorite = obj?.computers?.favorite ?? 'Unknown';