如何将含数组值的JavaScript对象键名改为复数形式?
解决对象数组键名复数化的问题
需求:输入一个JavaScript对象,返回它的副本,将所有值为数组的键名改为复数形式(末尾加s)。
当前尝试的思路是遍历对象,用Array.isArray()判断值是否为数组,已经能定位到需要修改的键(比如job、favouriteShop),但无法把原键替换成复数新键(jobs、favouriteShops),现有代码无法实现目标,询问是否能沿用当前思路或需要调整方法。
原尝试代码
function pluraliseKeys(obj) { const newObj = { ...obj }; for (const [key, value] of Object.entries(newObj)) { if (Array.isArray(value)) { console.log(key); // 此处需将原键替换为复数形式 newObj[key] = key + "s"; // 此写法无效 } } return newObj; } console.log( pluraliseKeys({ name: "Tom", job: ["writing katas", "marking"], favouriteShop: [ "Paul's Donkey University", "Shaq's Taxidermy Shack", "Sam's Pet Shop", ], }) );
问题分析
原代码的错误在于newObj[key] = key + "s"这行:它并没有替换键名,而是把原键对应的值改成了字符串形式的复数键名,完全偏离了需求。要实现键名替换,需要先删除原键,再添加新的复数键并赋值原数组,或者直接基于原对象构建一个全新的对象(这种方式更稳妥,避免遍历修改中的对象引发的问题)。
解决方案1:沿用遍历思路修正
遍历原对象(而非复制后的对象,避免遍历过程中对象结构变化的影响),对每个键值对做处理:如果值是数组,就用复数键名;否则保留原键名,最后构建新对象。
function pluraliseKeys(obj) { const newObj = {}; for (const [key, value] of Object.entries(obj)) { if (Array.isArray(value)) { // 值为数组时,使用复数键名 newObj[key + "s"] = value; } else { // 非数组值,保留原键名 newObj[key] = value; } } return newObj; }
解决方案2:更简洁的Object.fromEntries写法
利用Object.fromEntries可以更简洁地转换键值对数组:
function pluraliseKeys(obj) { return Object.fromEntries( Object.entries(obj).map(([key, value]) => Array.isArray(value) ? [key + "s", value] : [key, value] ) ); }
验证输出
调用上述函数后,会得到期望的结果:
{ name: 'Tom', jobs: ['writing katas', 'marking'], favouriteShops: [ "Paul's Donkey University", "Shaq's Taxidermy Shack", "Sam's Pet Shop" ] }
内容的提问来源于stack exchange,提问作者Vincenzo Chiovaro
相关产品推荐
相关产品推荐

