如果变量不存在,则返回 false



我有一些代码的结构是这样的,但在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。

可以说,处理此问题的最佳方法(同时保持遗留兼容性(是使用lodash:中的get

import { get } from 'lodash';
const result = get(dict, ['test2', 'testa']) || false;
// or
const result = get(dict, 'test2.testa') || false;

注意:要仅从lodash导入get(而不导入其他内容(,请使用lodash-es而不是lodash。换句话说,通过使用lodash-es,您可以在构建步骤中启用摇树lodash。

或者你可以简单地检查每个级别:

const result = dict && dict.test2 && dict.test2.testa || false;

如果遗留兼容性不是问题,您可以使用可选的链接,正如Noriller的回答中所建议的那样。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining

可选的链接甚至可以而且将在深度嵌套对象上工作

最重要的是,您可以使用nullish合并来返回一个";默认";(在你的情况下是假的(

var test_path1 = dict['test2']?.['testa'] ?? false

如果未定义,则返回值或false

您可以使用一些现代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)

如果您想编写更乐观的代码,也可以在代码中的某个位置使用try-catch。

try {
return dict.test1.test2
} catch (e) {
if (e instanceof TypeError)
return false
throw e
}

这样就不需要编写执行空检查的代码。

最新更新