对象javascript上的条件

时间:2015-06-12 13:26:27

标签: javascript node.js conditional

我会询问关于JS中对象的条件的最佳实践。

FEXP:

if (a.b.c.d == 1)

但如果我不知道该对象是否具有正确的结构,我需要像这样做条件:

if(a && a.b && a.b.c && a.b.c.d && a.b.c.d == 1)

检查值是最好的方法吗?试试吧?像这样的通用方法:

javascript test for existence of nested object key

不是最佳方式,因为我需要更改条件的定义。我可以在这个例子中使用这样的规则:     if(a.b [1] .c.d)

我需要记住所有路径,转换为字符串等......

我正在寻找好的解决方案我的第一个条件:     if(a.b.c.d == 1)

不改变它或以简单的方式改变它     if(是(a.b.c.d)== 1)

尝试捕获是可以的但不适用于大型条件:(

3 个答案:

答案 0 :(得分:0)

您可以检查每个值并继续检查,直到您用完为止。我在下面编写了一个小帮助函数,可以自动完成这个过程:

function checkDeep(object){
    for(var i = 1; i < arguments.length; i++){
        if(typeof object[arguments[i]] !== "undefined"){
            /* Check the type of the nested value - if not undefined,
             * set it to `object` and continue looping. */
            object = object[arguments[i]]
        } else {
            /* If it is not undefined, return false. */
            return false;
        }
    }
    /* If we made it past the loop, all the values exist and we return true. */
    return true;
}

您可以在最后添加任意数量的变量,并查看它们是否嵌套在前一个值中。如果它在任何地方遇到链中断,它将返回false。所以它的定义是:

checkDeep(object, var1[, var2, var3, ...]);

它将被称为:

checkDeep({a:{b:{c:['d']}}}, 'a', 'b', 'c'); // true
checkDeep({a:{b:{c:['d']}}}, 'a', 'c', 'c'); // false

如果您想要该位置的值,请​​在函数末尾使用return object而不是return true

function checkDeep(object){
    for(var i = 1; i < arguments.length; i++){
        if(typeof object[arguments[i]] != 'undefined') object = object[arguments[i]]
        else return false;
    }
    return true;
}

var object = {a:{b:{c:['d']}}};

document.write("Order a,c,c in '{a:{b:{c:['d']}}}' is " + (checkDeep(object, 'a', 'c', 'c') ? "true" : "false") + "<br />");
checkDeep(object, 'a', 'c', 'c'); // false

document.write("Order a,b,c in '{a:{b:{c:['d']}}}' is " + (checkDeep(object, 'a', 'b', 'c') ? "true" : "false") + "<br />");
checkDeep(object, 'a', 'b', 'c'); // true

答案 1 :(得分:0)

你可以尝试:

function get_value(variable, elements) {
   if (elements.length === 0) {
      return variable;
   }
   var key = elements.shift();
   return variable[key] && get_value(variable[key], elements); 
}

var a={b:{c:{d:{e:24}}}}

console.log(get_value(a, ['b','c','d','e'])) //24

console.log(get_value(a, ['b','c','d','e', 'f'])) //undefined

仅检查值是否存在:

function check(variable, elements) {
   if (elements.length === 0) {
      return true;
   }
   var key = elements.shift();
   return variable[key] !== undefined && check(variable[key], elements); 
}

答案 2 :(得分:0)

CoffeeScript有存在操作符:

a?.b?.c?.d

https://esdiscuss.org/topic/existential-operator-null-propagation-operator的ES6讨论列表中,对这一主题进行了广泛的讨论,也称为“空传播算子”。