Skip to content

setWith

INFO

出于兼容性原因,此函数仅在 es-toolkit/compat 中提供。它可能具有替代的原生 JavaScript API,或者尚未完全优化。

es-toolkit/compat 导入时,它的行为与 lodash 完全一致,并提供相同的功能,详情请见 这里

使用 customizer 函数在指定对象的特定路径上设置值。 如果路径的某部分不存在,将根据 customizer 的结果创建它。

这个方法与 set 类似,但不同之处在于它接受一个 customizer 来创建嵌套对象。

customizer 被调用来生成路径的对象。 如果 customizer 返回一个值,该值将用于当前路径段。 如果 customizer 返回 undefined,该方法将根据路径创建适当的对象。 如果下一个路径段是有效的数组索引,则创建数组,否则创建对象。

签名

typescript
function setWith<T extends object | null | undefined>(
  obj: T,
  path: PropertyKey | readonly PropertyKey[],
  value: unknown,
  customizer?: (value: unknown) => unknown
): T;

参数

  • obj (T): 要修改的对象。
  • path (PropertyKey | readonly PropertyKey[]): 要设置的属性路径。
  • value (unknown): 要设置的值。
  • customizer ((value: unknown) => unknown): 用于自定义路径创建的函数。

返回值

(T): 返回修改后的对象。

示例

typescript
import { setWith } from 'es-toolkit/compat';
import { isObject } from 'es-toolkit/compat';

// 使用定制器在嵌套数组中设置值
const object = {};
setWith(object, '[0][1][2]', 3, value => (isObject(value) ? undefined : {}));
console.log(object); // => { '0': { '1': { '2': 3 } } }

// 使用 Object 作为定制器为数组创建对象
const obj2 = {};
setWith(obj2, 'a[0].b.c', 4, Object);
console.log(obj2); // => { a: [{ b: { c: 4 } }] }

// 不使用定制器创建路径(与使用 set 相同)
const obj3 = {};
setWith(obj3, 'a.b.c', 4);
console.log(obj3); // => { a: { b: { c: 4 } } }

采用 MIT 许可证发布。