Skip to content

Lodash - 对象

Lodash 提供了一套强大的函数,用于操作和处理 JavaScript 对象。虽然现代 JavaScript (ES6+) 引入了诸如 Object.assign、Object.keys、Object.values 和 Object.entries 等原生方法,但 Lodash 通常提供了更强大、更灵活或更方便的替代方案,尤其是在处理诸如深度合并、安全属性访问和转换对象结构等复杂操作时。

本节将探讨 Lodash 中用于对象操作的关键方法,重点介绍它们的用途,并在适用的情况下与原生 JavaScript 特性进行比较。

以下是一些常用的 Lodash 对象方法:

方法与语法描述与现代 JS 对比
assign
_.assign(object, [sources])
将源对象的自身可枚举字符串键属性分配到目标对象。源对象按从左到右的顺序应用。修改 object。类似于 Object.assign(),但 Lodash 不会触发目标对象上的 setter。
assignIn
_.assignIn(object, [sources])
与 _.assign 类似,但包含继承的源属性。
defaults
_.defaults(object, [sources])
为目标对象上 undefined 的所有属性,将源对象的自身可枚举字符串键属性分配到目标对象。用于设置默认选项。修改 object。
defaultsDeep
_.defaultsDeep(object, [sources])
与 _.defaults 类似,但递归地分配默认属性。
get
_.get(object, path, [defaultValue])
安全地获取 object 中 path 路径下的值。如果路径不存在,则返回 defaultValue。可防止访问潜在为 null 或 undefined 的对象的嵌套属性时出错。在现代 JS 中,可通过可选链 (?.) 部分替代,但 _.get 更健壮地处理字符串或数组形式的路径。
set
_.set(object, path, value)
设置 object 中 path 路径下的值。如果路径的某部分不存在,则会创建它。修改 object。
has
_.has(object, path)
检查 path 是否是 object 的直接属性。对于使用 Object.create(null) 创建的对象,比 obj.hasOwnProperty(key) 更安全。
hasIn
_.hasIn(object, path)
检查 path 是否是 object 的自身或继承属性。
keys
_.keys(object)
创建一个包含 object 自身可枚举属性名的数组。类似于 Object.keys()。
keysIn
_.keysIn(object)
创建一个包含 object 自身和继承的可枚举属性名的数组。类似于 for...in 循环的键。
values
_.values(object)
创建一个包含 object 自身可枚举属性值的数组。类似于 Object.values()。
valuesIn
_.valuesIn(object)
创建一个包含 object 自身和继承的可枚举属性值的数组。
toPairs
_.toPairs(object)
创建一个包含 object 自身可枚举字符串键值对的数组。类似于 Object.entries()。
toPairsIn
_.toPairsIn(object)
创建一个包含 object 自身和继承的可枚举字符串键值对的数组。
merge
_.merge(object, [sources])
递归地将源对象的自身和继承的可枚举字符串键属性合并到目标对象中。修改 object。与 Object.assign 不同,它会合并嵌套对象而不是覆盖它们。
pick
_.pick(object, [paths])
创建一个由 object 中由 paths 指定的属性组成的对象。
pickBy
.pickBy(object, [predicate=.identity])
创建一个由 object 中 predicate 返回真值的属性组成的对象。
omit
_.omit(object, [paths])
创建一个由 object 中自身和继承的可枚举属性路径组成的对象,这些路径是未省略的。
omitBy
.omitBy(object, [predicate=.identity])
创建一个由 object 中自身和继承的可枚举属性路径组成的对象,这些路径 predicate 返回假值的。
mapValues
.mapValues(object, [iteratee=.identity])
创建一个对象,其键与 object 相同,值由遍历 object 的每个自身可枚举字符串键属性并通过 iteratee 函数生成。
findKey
.findKey(object, [predicate=.identity])
遍历自身可枚举属性,返回第一个 predicate 返回真值的元素的键。
invert
_.invert(object)
创建一个由 object 的键值对颠倒组成的对象。如果 object 包含重复值,后面的值会覆盖前面值对应的属性分配。
transform
.transform(object, [iteratee=.identity], [accumulator])
另一种替代 _.reduce 的对象方法,允许在 iteratee 未显式返回时隐式返回累加器。对于构建对象可能更简洁。
unset
_.unset(object, path)
移除 object 中 path 路径下的属性。如果属性被删除则返回 true,否则返回 false。修改 object。

对于简单的任务,可以考虑使用原生 JavaScript 方法(如 Object.assign、Object.keys 等),以潜在地减小打包体积并利用内置引擎优化。当你需要以下功能时,则选择 Lodash:

  • 深度操作: _.merge、_.defaultsDeep、_.cloneDeep(来自 Lang 模块)。
  • 安全属性访问: _.get、_.result。
  • 高级过滤/转换: _.pickBy、_.omitBy、_.mapValues、_.transform。
  • 便利性: 在诸如 _.pickBy、_.findKey 等方法中使用谓词 (predicate) 的简写语法。
  • 一致性: 处理潜在的非标准对象(例如,使用 Object.create(null) 创建的对象)。
  • 全面的实用工具: 诸如 _.invert、_.findKey、_.defaults 等函数没有直接的原生对应方法。
import _ from 'lodash-es';
const user = {
name: 'Alice',
address: {
street: '123 Main St',
// 缺少 city 属性
},
preferences: null
};
const config = {
timeout: 5000,
retries: 3
};
// 安全获取嵌套属性
const city = _.get(user, 'address.city', 'Unknown');
// city 是 'Unknown'
// 原生替代方案:const city = user?.address?.city ?? 'Unknown';
// 安全获取可能为 null 的对象的属性
const theme = _.get(user, 'preferences.theme', 'light');
// theme 是 'light'
// 原生替代方案:const theme = user?.preferences?.theme ?? 'light';
// 设置默认配置
const currentConfig = { retries: 5 };
_.defaults(currentConfig, config);
// currentConfig 现在是 { retries: 5, timeout: 5000 }
console.log(`City: ${city}`);
console.log(`Theme: ${theme}`);
console.log('Config:', currentConfig);

请查阅 Lodash 官方文档,获取每个对象方法的详细解释和更多示例。