如果变量不存在则返回 false

时间:2021-07-04 22:59:03

标签: javascript

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

4 个答案:

答案 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
}

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