我会询问关于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)
尝试捕获是可以的但不适用于大型条件:(
答案 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讨论列表中,对这一主题进行了广泛的讨论,也称为“空传播算子”。