JavaScript中如何将对象的字符串类型属性值转换为单元素数组格式?
原地将对象字符串属性转换为单元素数组的实现
实现思路
完全在原对象上完成覆盖修改,不生成新的对象副本,统一所有属性的数组结构,适配后续按索引取值的逻辑:
- 遍历对象的所有自有可枚举属性
- 逐属性判断值类型:
- 值为字符串时,替换为仅包含该值的单元素数组
- 值本身是数组时,完全保留原有结构,不做任何改动
可直接复用的代码
function normalizeStringPropsToSingleArray(targetObj) { // 仅遍历对象自有的可枚举属性,避免触碰原型链上的继承属性 Object.keys(targetObj).forEach(propKey => { const currentValue = targetObj[propKey]; // 判断值是否为普通字符串,是则替换为单元素数组 if (typeof currentValue === 'string') { targetObj[propKey] = [currentValue]; } }); }
如果需要兼容new String()创建的包装字符串,可将判断条件替换为:
if (typeof currentValue === 'string' || currentValue instanceof String) { targetObj[propKey] = [currentValue.toString()]; }
使用示例
// 你最初拿到的原始对象 const rawObj = { key1: "value1", key2: ["value2", "value3", "value4"], key3: ["value5", "value6"], key4: "value7" }; // 调用方法直接原地修改 normalizeStringPropsToSingleArray(rawObj); // 修改完成后的rawObj结构: // { // key1: ["value1"], // key2: ["value2", "value3", "value4"], // key3: ["value5", "value6"], // key4: ["value7"] // }
特性说明
- 所有修改直接作用于传入的原对象,无额外对象副本开销,完全符合原地覆盖的要求
- 原有数组类型的属性不会被改动,元素顺序、嵌套结构都会完整保留
- 修改完成后所有属性值均为数组结构,原有
对象.key[i]的索引取值逻辑可以统一复用,不会再出现访问字符串下标时取到单个字符的问题 - 遍历逻辑不会读取对象原型链上的继承属性,避免误改无关内容
内容的提问来源于stack exchange,提问作者Karthik Sadanand
相关产品推荐
相关产品推荐

