如何不区分大小写选择指定名称的对象索引?附代码示例
嘿,你之前尝试用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
相关产品推荐
相关产品推荐

