JS:如何将列表项转为小写并以此获取对象键值?
问题与解决方案
问题描述
现有设备列表、实体列表及多个实体配置对象,需要通过实体列表中首字母大写的项,匹配对应小写命名的配置对象并获取其键值。原代码如下:
let devices = ['001A2208B97D','001A2208C9FA','001A2214ADC8','001A2214A73A','001A2214B86E','001A2214A6DF','001A2214ADBF','001A2208CFD3'] let entities = ['Temperature', 'Valve', 'Battery', 'Offset'] let temperature = { device_class: 'temperature', icon: "hass:thermometer-bluetooth", unit: "°C"} let valve = { device_class: '', icon: "hass:valve", unit: "%"} let battery = { device_class: 'battery', icon: "hass:battery-bluetooth", unit: ""} let offset = { device_class: '', icon: "hass:offset", unit: "°C" } for (let i = 0; i < devices.length; i++) { for (let j = 0; j < entities.length; j++) { msg.payload = { "icon": temperature['icon'], "unit_of_measurement": temperature['unit'], "state_class": "measurement", } } }
需求:无需预创建小写实体映射集合,用一行式写法实现将实体列表项转为小写后,匹配对应配置对象并获取属性。此前尝试entities[0].toLowerCase()['unit']写法失败,寻求可行方案。
解决方案
可以利用globalThis(通用JavaScript环境的全局对象)来动态访问全局作用域中的配置对象,实现一行式匹配:
循环内动态获取配置的完整写法
for (let i = 0; i < devices.length; i++) { for (let j = 0; j < entities.length; j++) { // 一行完成实体名转小写 + 获取对应配置对象 const entityConfig = globalThis[entities[j].toLowerCase()]; msg.payload = { "icon": entityConfig.icon, "unit_of_measurement": entityConfig.unit, "state_class": "measurement", } } }
直接获取单个属性的一行式写法
// 示例:获取第一个实体的unit属性 const firstEntityUnit = globalThis[entities[0].toLowerCase()].unit;
说明
globalThis是ES2020标准引入的全局对象,可在浏览器、Node.js等所有JavaScript环境中统一访问全局变量,替代浏览器的window和Node.js的global。- 将实体名称转小写后作为
globalThis的键,即可直接拿到对应的配置对象,无需额外创建映射集合。
内容的提问来源于stack exchange,提问作者AleXSR700
相关产品推荐
相关产品推荐

