所以我有一个回调函数,它提供了一个json对象:
function(object){
var data=object.packet.link.ip.tcp.data;
console.log(data.toString());
}
我遇到的问题是任何packet / link / ip / tcp / data都可能是" undefined" - 我的node.js程序每遇到一个未定义的变量就会失败。
我尝试了"数据"的声明。在try / catch中,但是我一直在" undefined"错误 - 我的猜测是我需要放置object / object.packet / object.packet.link / object.packet.link.ip / etc.在try / catch。
所以,我找到了一些优雅的咖啡因:
if object?.packet?.link?.ip?.tcp?.data? then doStuff()
编译为:
var _ref, _ref1, _ref2, _ref3;
if ((typeof object !== "undefined" && object !== null ? (_ref = object.packet) != null ? (_ref1 = _ref.link) != null ? (_ref2 = _ref1.ip) != null ? (_ref3 = _ref2.tcp) != null ? _ref3.data : void 0 : void 0 : void 0 : void 0 : void 0) != null) {
//doStuff:
var data = object.packet.link.ip.tcp.data;
console.log(data.toString());
}
呸!
现在它完美无缺,但我只是想知道在纯Javascript中是否有更优雅(可读)的方法吗?
答案 0 :(得分:5)
你可以做到
["packet", "link", "ip", "tcp", "data"]
.reduce(function (m, i) { if (m) return m[i]; }, object);
您可以将reduce
移动到一个函数中并拥有get(object, "packet", "link", "ip", "tcp", "data")
。虽然简单的&&
解决方案可能更明智,但它可能很漂亮。
答案 1 :(得分:3)
如果它足以检查您是否正在处理 truthy 值,您可能会像
一样var data = object && object.packet && object.packet.link && object.packet.link.ip; // etc.
仍然没有美丽,但最有可能是你能做的最好的。当然,你总是可以选择介绍好的' try..catch
条款。
try {
var data = object.packet.link.ip.tcp.data;
} catch( ex ) { }
任何事情"更好"而不是优雅" (无论谁定义)都需要一个自定义编写的函数,它逐步遍历对象属性,检查是否存在。
答案 2 :(得分:1)
function A(object)
{
var data = object?object.packet?object.packet.link?object.packet.link.ip?object.packet.link.ip.tcp? object.packet.link.ip.tcp.data:null:null:null:null:null;
console.log(data);
}
注意强>:
如果data为null,则不能在null上调用toString,因为null(以及undefined)是唯一没有对象包装器且后来没有toString()函数的两个基元。