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

如何将含数组值的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 19:35:33