No, ya has encontrado el camino correcto. Por supuesto, puede usar un bloque try/catch
y manejar el error después de los hechos, pero yo usaría la solución x && x.y && x.y.z && x.y.z.a
.
(No es necesario el === true
a menos que realmente desea la condición sólo es cierto cuando a
es estrictamente igual a true
y no cuando es 1
o "hi"
, pero a partir de su pregunta, estoy pensando en eso ya lo sabes .)
usted ha dicho que no desea utilizar una función para esto, y no he sentido la necesidad de uno cualquiera, sino sólo para ajustes y risitas:
function ref(obj, names) {
var rv = obj, index;
if (names) {
for (index = 0; rv && index < names.length; ++index) {
rv = rv[names[index]];
}
}
return rv;
}
Uso:
if (ref(x, ["y", "z", "a"]) === true) {
// do something
}
llamadas a funciones son so cheap these days ...
O alternativamente:
function ref(obj) {
var rv = obj, index;
for (index = 1; rv && index < arguments.length; ++index) {
rv = rv[arguments[index]];
}
return rv;
}
Uso:
if (ref(x, "y", "z", "a") === true) {
// do something
}
... pero en la mayoría de los motores de JavaScript, que será más lento (arguments
tiende a ser lento). Pero, una vez más, tendrías que hacerlo miles de veces seguidas para que la velocidad sea un problema.
O como sugiere Šime, una sola variable (que estaba evitando la split
, pero no es caro):
function ref(obj, path) {
var rv = obj, names = path.split("."), index;
for (index = 0; rv && index < names.length; ++index) {
rv = rv[names[index]];
}
return rv;
}
Uso:
if (ref(x, "y.z.a") === true) {
// do something
}
Live example of all three | Live source
El último es el más corto. Para nombres más largos, también puede usar: 'var tmp = x; if (tmp && (tmp = tmp.verylongname) && (tmp = tmp.evenlongernameblabla) && (tmp = tmp.doyougetit)) {...} '. –
Me gustaría utilizar una función especial en este caso. –
@Jesse, ¿puedes dar el ejemplo? – Sherzod