我有一些这样结构的代码,但有一堆变量,在 dict 中可能存在也可能不存在不同深度的路径:
var dict = {
'test1': 'test',
'test2': ['testa', 'testb'],
}
var test_path1 = dict['test2']['testa'] ? test_path1: false
var test_path2 = dict['test3']['testz'] ? test_path2: false
console.log(test_path2)
基本上我的程序创建了一堆数组,它根据用户输入保存在 user_dict 中。稍后我需要处理 dict 并检查一些变量以查看它们的值,或者它们是否存在。
不过,我什至无法达到这一点,因为定义 test_path2 返回“无法读取未定义的属性 testz。”
我想用 ? test_path2: false 会起作用,但我仍然遇到同样的错误。
有人建议使用可选链接,但这似乎不是一个好的解决方案,因为我的一些变量位于 4-5 个嵌套对象/数组中,每个对象/数组可能存在也可能不存在。
处理这个问题的最佳方法是什么?我的语法有错误还是我以错误的方式解决问题?如果 test_path1 和 test_path2 不存在,我只需要它返回 false。
答案 0 :(得分:1)
您可以使用一些现代 JavaScript 功能。尝试可选链:
var dict = {
'test1': 'test',
'test2': { 'testa': 'testb' },
}
var test_path1 = dict['test2']?.['testa'] || false
var test_path2 = dict['test3']?.['testz'] || false
console.log(test_path1, test_path2)
答案 1 :(得分:1)
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining
可选链接甚至可以并且将适用于深度嵌套的对象
最重要的是,您可以使用无效合并来返回“默认”(在您的情况下为错误)
var test_path1 = dict['test2']?.['testa'] ?? false
如果未定义,这将返回值或 false
答案 2 :(得分:1)
可以说,处理此问题的最佳方法(同时保持旧版兼容性)是使用 get
中的 lodash
:
import { get } from 'lodash';
const result = get(dict, ['test2', 'testa']) || false;
// or
const result = get(dict, 'test2.testa') || false;
注意:要仅从 get
导入 lodash
(而不是其他任何东西),请使用 lodash-es
而不是 lodash
。换句话说,通过使用 lodash-es
,您可以在构建步骤启用 tree-shaking lodash。
或者您可以简单地检查每个级别:
const result = dict && dict.test2 && dict.test2.testa || false;
如果旧版兼容性不是问题,您可以使用可选链,如 Noriller's answer 中建议的那样。
答案 3 :(得分:0)
如果您想编写更乐观的代码,您也可以在代码中的某个位置使用 try catch。
try {
return dict.test1.test2
} catch (e) {
if (e instanceof TypeError)
return false
throw e
}
这样就不需要编写进行空检查的代码。