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

如何不区分大小写选择指定名称的对象索引?附代码示例

嘿,你之前尝试用table[/table/i]这种方式来做不区分大小写的属性访问是行不通的——JS会把正则对象转换成字符串"/table/i"来作为键名,而你的对象里根本没有这个键,所以自然返回undefined。下面给你几个实用的解决方案,按需选择:

方案1:遍历键名实时匹配

这是最直接的方式,遍历对象的所有键,通过统一转成小写(或大写)来做不区分大小写的匹配:

let table = {'tAble': [{'number': 1}],'CHair': [{'number': 2}]};

function getCaseInsensitiveProp(obj, propName) {
  const targetProp = propName.toLowerCase();
  // 遍历所有键找匹配项
  for (const key of Object.keys(obj)) {
    if (key.toLowerCase() === targetProp) {
      return obj[key];
    }
  }
  // 没找到的话返回undefined或者自定义默认值
  return undefined;
}

// 测试调用
console.log(getCaseInsensitiveProp(table, 'table')); // 输出: [ { number: 1 } ]
console.log(getCaseInsensitiveProp(table, 'CHAIR')); // 输出: [ { number: 2 } ]

这个方法简单直接,不需要提前预处理,适合偶尔查询的场景。

方案2:提前构建大小写映射表

如果需要频繁查询同一个对象的属性,建议先提前构建一个小写键名到原属性的映射表,这样后续查询效率更高:

let table = {'tAble': [{'number': 1}],'CHair': [{'number': 2}]};

// 一次性构建映射
const caseInsensitiveMap = {};
for (const key of Object.keys(table)) {
  caseInsensitiveMap[key.toLowerCase()] = table[key];
}

// 后续直接用小写键查询
console.log(caseInsensitiveMap['table']); // 输出: [ { number: 1 } ]
console.log(caseInsensitiveMap['chair']); // 输出: [ { number: 2 } ]

这种方式只需要遍历一次对象,之后的查询都是O(1)的时间复杂度,适合高频查询的场景。

方案3:用Proxy实现原生式不区分大小写访问(ES6+)

如果你想让对象本身就支持任意大小写的属性访问,可以用ES6的Proxy来拦截属性读取操作,实现“原生”的不区分大小写访问:

let table = {'tAble': [{'number': 1}],'CHair': [{'number': 2}]};

const caseInsensitiveTable = new Proxy(table, {
  get(target, prop) {
    // 如果是Symbol或者原本就存在的属性,直接返回
    if (typeof prop === 'symbol' || prop in target) {
      return target[prop];
    }
    // 转小写后查找匹配的键
    const lowerProp = prop.toLowerCase();
    const matchingKey = Object.keys(target).find(key => key.toLowerCase() === lowerProp);
    return matchingKey ? target[matchingKey] : undefined;
  }
});

// 现在可以随心所欲地用任意大小写访问了
console.log(caseInsensitiveTable.table); // 输出: [ { number: 1 } ]
console.log(caseInsensitiveTable.CHAIR); // 输出: [ { number: 2 } ]
console.log(caseInsensitiveTable['TaBlE']); // 输出: [ { number: 1 } ]

这个方案最优雅,让对象的属性访问行为完全符合你的预期,但要注意Proxy是ES6特性,需要运行环境支持(现代浏览器和Node.js 6+都没问题)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 22:07:51