You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将多个对象属性作为参数传入函数?

解决嵌套对象属性的动态获取问题

首先得明确一个关键误区:你直接写func(obj, a.b.c)是行不通的——这里的a会被JavaScript当作未定义的变量解析,直接抛出ReferenceError。正确的做法是把属性路径以字符串(比如"a.b.c")或者数组(比如['a','b','c'])的形式传入函数,接下来我们就针对这两种传参方式实现可行的解决方案。

方案1:兼容字符串与数组的通用实现

这个函数会自动识别属性路径的类型,统一转成数组后逐层遍历对象,还做了安全访问处理:

var obj = {a: {b: {c: 'result'}}};

function func(obj, attributes) {
  // 把属性路径统一转为数组格式
  const pathSegments = typeof attributes === 'string'
    ? attributes.split('.')
    : [...attributes];
  
  // 用reduce逐层访问嵌套属性,可选链操作符避免中途报错
  return pathSegments.reduce((current, key) => {
    return current?.[key];
  }, obj);
}

// 两种传参方式都能正常工作
console.log(func(obj, "a.b.c")); // 输出 'result'
console.log(func(obj, ['a','b','c'])); // 输出 'result'

代码细节说明

  • 第一步判断参数类型:如果是字符串,用split('.')拆成属性数组;如果是数组,直接复制一份避免修改原数组。
  • 使用Array.reduce()遍历路径数组,初始值为传入的目标对象obj。
  • 用可选链操作符?.做安全访问:如果中间某一层属性不存在,会直接返回undefined,不会抛出Cannot read properties of undefined的错误,让代码更健壮。

方案2:仅支持数组路径的极简实现

如果确定只会传入数组形式的属性路径,函数可以写得更简洁:

var obj = {a: {b: {c: 'result'}}};

function func(obj, attributes) {
  let current = obj;
  for (const key of attributes) {
    if (!current) break; // 提前终止,避免无意义的遍历
    current = current[key];
  }
  return current;
}

console.log(func(obj, ['a','b','c'])); // 输出 'result'

额外提醒

如果你的属性名里包含.(比如obj['a.b'].c),那字符串形式的路径就不适用了,必须用数组形式传参(比如['a.b', 'c']),避免拆分错误。

内容的提问来源于stack exchange,提问作者Forsaiken

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 22:02:48