📜  _.get 替代方案 - Javascript (1)

📅  最后修改于: 2023-12-03 14:38:59.534000             🧑  作者: Mango

以'_.get 替代方案 - Javascript

_.get 是 Lodash 一个非常常用的函数,它用于安全地获取深层次对象的属性,可以避免由于属性不存在而导致程序抛出异常。但是,在某些情况下,您可能无法使用 Lodash 或不想使用它。那么有哪些替代方案呢?

使用 Optional chaining

在 JavaScript ECMA2020 中引入了 Optional chaining(可选链),可以用于安全地获取对象或数组深层次的属性值。它使用 ?. 操作符,示例代码如下:

const myObject = {
  foo: {
    bar: {
      baz: 42
    }
  }
};
const result = myObject?.foo?.bar?.baz;  // 42

以上代码会返回值为 42,如果要获取的属性不存在,则返回 undefined。Optional chaining 还可以与其他操作符一起使用,并且可以被嵌套进行更深层的属性访问。

手动实现 Lodash 中的 _.get

如果你不想使用 Optional chaining 或需要支持更古老的 JavaScript 版本,可以手动实现 Lodash 中的 _.get。

function get(obj, path, defaultValue) {
  let result = obj;
  for (let i = 0; i < path.length; i++) {
    result = result[path[i]];
    if (result === undefined) {
      return defaultValue;
    }
  }
  return result;
}

// 使用方式:
const myObject = {
  foo: {
    bar: {
      baz: 42
    }
  }
};
const result = get(myObject, ['foo', 'bar', 'baz'], 'default'); // 42

以上代码首先会遍历属性路径数组,获取对象深层次属性的值。如果属性不存在,则返回默认值。这样您就可以更轻松地安全获取对象的深层次属性了。

使用 ES6 destructuring 语法

如果您不需要获取太深的属性,您也可以使用 ES6 destructuring 语法。这种方法可以将属性从对象中提取到变量中,示例代码如下:

const myObject = {
  foo: {
    bar: {
      baz: 42
    }
  }
};
const { foo: { bar: { baz: result } = {} } = {} } = myObject;

以上代码会将变量 result 的值设置为 42,如果属性不存在,则返回 undefined。这种方法可以非常方便地获取深层次对象的属性,但只适用于属性数量不太多的情况。

总结

以上三种方法都可以用于安全地获取对象的深层次属性。Optional chaining 是最新的 JavaScript 标准,而手动实现 Lodash 中的 _.get 则适用于更老的 JavaScript 版本和需要更良好的兼容性的场景。使用 ES6 destructuring 语法可以方便地获取较浅的对象属性。