【问题标题】:conditionals on object javascript [duplicate]对象javascript的条件[重复]
【发布时间】:2015-08-28 12:53:45
【问题描述】:

我会询问关于 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)

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

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

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

try catch 是可以的,但对于大量的条件则不行:(

【问题讨论】:

  • 为什么不直接使用if(a.b.c.d && a.b.c.d == 1){ // work Magic }
  • @Pogrindis 如果未定义b,则抛出ReferenceError,@KimYu 请参阅:stackoverflow.com/questions/25973300/…
  • @Pogrindis 将其放入 js 控制台并找出原因
  • 有人可能会争辩说,如果您要深入访问属性,则可能需要对代码进行一些重构
  • 是的.. 常识中的星期五失效!

标签: javascript node.js conditional


【解决方案1】:

你可以试试:

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); 
}

【讨论】:

  • 也许偷偷摸摸的方法会更方便。就像返回 truefalse 一样,如果您可以安全地访问所要求的密钥
  • 我不认为你真的需要,但我添加了代码选项。
  • bad...我不需要带有少量参数的函数 - 我有一个简单的错误路径:abcd bad = 因为对象“a”没有键“b”所以我想使用只有这条路径 abcd = 错误的对象并将其放入 exp 函数中,女巫给我假或真
  • 在你的例子中我将如何检查这个值的另一件事:if(a.b['oo-dd-zz'][3].c.d.e){}
  • 在 var a={b:{c:[{d:{e:24}}]}} 你可以 console.log(get_value(a, ['b','c', 0 ,'d','e'])) 可以添加索引
【解决方案2】:

CoffeeScript 有存在运算符:

a?.b?.c?.d

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

【讨论】:

    【解决方案3】:

    您可以检查每个值并继续检查,直到用尽深度。我在下面编写了一个小辅助函数,它将自动执行此过程:

    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

    【讨论】:

    • bad...我不需要带有少量参数的函数 - 我有一个简单的错误路径:abcd bad = 因为对象“a”没有键“b”所以我想使用只有这条路径 abcd = 错误的对象并将其放入 exp 函数中,女巫给我 false 或 true
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 2018-06-17
    • 2017-10-19
    • 2014-07-19
    • 1970-01-01
    • 2022-10-14
    相关资源
    最近更新 更多