我正在尝试测试对象属性的真实性。无论它是否存在并具有值,都使用该值,如果不存在,则将默认值添加到另一个对象。
const initNetwork = ( setupObj ) => {
let obj = {};
obj = Object.assign({}, setupObj);
obj.eth0 = obj.eth0 ? obj.eth0 : {};
obj.wlan0 = obj.wlan0 ? obj.wlan0 : {};
obj.eth0.server = obj.eth0.server ? obj.eth0.server : {};
obj.wlan0.client = obj.wlan0.client ? obj.wlan0.client : {};
obj.wlan0.server = obj.wlan0.server? obj.wlan0.server : {};
obj.eth0.mac = null;
obj.wlan0.mac = null;
obj.eth0.server.address = setupObj.eth0.server.address ? setupObj.eth0.server.address : "10.0.0.1";
}
initNetwork(); // intentionally leaving this empty to test setting default values.
不过我在这里遇到了错误。我认为它会返回 undefined,因此会将 obj.eth0.server.address 设置为“10.0.0.1”的错误值。
obj.eth0.server.address = setupObj.eth0.server.address ? setupObj.eth0.server.address : "10.0.0.1";
^
TypeError: Cannot read property 'eth0' of undefined
查看此键/值对是否一直存在于树中以及如果存在则使用该值,否则设置 false 值的最佳方法是什么?
最佳答案
您正在分配一个名为 obj
的新对象,因此您的检查应该针对 obj
。
在这种情况下,setupObj
将始终为未定义
。
您可以使用 &&
运算符为 setupObj
添加另一个条件:
obj.eth0.server.address = (setupObj && setupObj.eth0.server.address) ? setupObj.eth0.server.address : "10.0.0.1";
当然,建议检查每一层嵌套对象。
运行示例:
const initNetwork = ( setupObj ) => {
let obj = {};
obj = Object.assign({}, setupObj);
obj.eth0 = obj.eth0 ? obj.eth0 : {};
obj.wlan0 = obj.wlan0 ? obj.wlan0 : {};
obj.eth0.server = obj.eth0.server ? obj.eth0.server : {};
obj.wlan0.client = obj.wlan0.client ? obj.wlan0.client : {};
obj.wlan0.server = obj.wlan0.server? obj.wlan0.server : {};
obj.eth0.mac = null;
obj.wlan0.mac = null;
obj.eth0.server.address = (setupObj && setupObj.eth0.server.address) ? setupObj.eth0.server.address : "10.0.0.1";
}
initNetwork(); // intentionally leaving this empty to test setting default values.
关于javascript - 为什么这个三元会抛出错误而不是评估为 false?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48552489/