Javascript 多元化包含数组的对象键

Javascript 多元化包含数组的对象键,javascript,Javascript,我得到了一个存储钥匙信息的对象。我需要将包含数组的键更改为复数,例如: { name: 'Tom', job: ['writing katas', 'marking'], favouriteShop: [ "Paul's Donkey University", "Shaq's Taxidermy Shack", "Sam's Pet Shop" ] }; 应该是: { name: 'Tom', jobs: ['writing

我得到了一个存储钥匙信息的对象。我需要将包含数组的键更改为复数,例如:

{
   name: 'Tom',
   job: ['writing katas', 'marking'],
   favouriteShop: [
     "Paul's Donkey University",
     "Shaq's Taxidermy Shack",
     "Sam's Pet Shop"
   ]
};
应该是:

{
    name: 'Tom',
    jobs: ['writing katas', 'marking'],
    favouriteShops: [
      "Paul's Donkey University",
      "Shaq's Taxidermy Shack",
      "Sam's Pet Shop"
    ]
}

有人能帮忙吗?

你可以用
reduce

const obj={
名字:“汤姆”,
工作:[“写卡塔”,“标记”],
精品店:[
“保罗的驴子大学”,
“沙克的标本室”,
“山姆宠物店”
]
};
const result=Object.keys(obj).reduce((acc,key)=>{
if(Array.isArray(obj[key])){
acc[`${key}s`]=obj[key]
}否则{
acc[键]=obj[键]
}
返回acc
}, {})

控制台日志(结果)您可以使用
reduce

const obj={
名字:“汤姆”,
工作:[“写卡塔”,“标记”],
精品店:[
“保罗的驴子大学”,
“沙克的标本室”,
“山姆宠物店”
]
};
const result=Object.keys(obj).reduce((acc,key)=>{
if(Array.isArray(obj[key])){
acc[`${key}s`]=obj[key]
}否则{
acc[键]=obj[键]
}
返回acc
}, {})
控制台日志(结果)
const数据={
名字:“汤姆”,
工作:[“写卡塔”,“标记”],
精品店:[
“保罗的驴子大学”,
“沙克的标本室”,
“山姆宠物店”
]
};
const newData={};
用于(输入数据){
const newKey=Array.isArray(data[key])&&data[key].length>1?`${key}s`:key;
newData[newKey]=数据[key];
}
console.log(newData)
const数据={
名字:“汤姆”,
工作:[“写卡塔”,“标记”],
精品店:[
“保罗的驴子大学”,
“沙克的标本室”,
“山姆宠物店”
]
};
const newData={};
用于(输入数据){
const newKey=Array.isArray(data[key])&&data[key].length>1?`${key}s`:key;
newData[newKey]=数据[key];
}

console.log(newData)
您不能更改原始输出的生成方式吗?对输出进行变异似乎过于复杂,因此更改附加了s的键可能很容易实现,但转换为精确的复数可能很棘手。你想要精确的复数吗?你不能改变原始输出的生成方式吗?对输出进行变异似乎过于复杂,因此更改附加了s的键可能很容易实现,但转换为精确的复数可能很棘手。你想要精确的复数吗?这是相当昂贵的(在每个键上进行
acc
的浅拷贝),为什么不简单地在一个对象上创建随时间返回的新键呢?这样可以避免改变原始对象。当然,但之后不需要所有的浅拷贝,第一个acc已经是一个新对象,因为您为reduce函数指定了一个种子hh,现在我明白了您的意思。我将更新答案。这相当昂贵(在每个键上进行
acc
的浅拷贝),为什么不在一个对象上创建随时间返回的新键呢?这可以避免改变原始对象。当然,但之后不需要所有的浅拷贝,第一个acc已经是一个新对象,因为您为reduce函数指定了一个种子hh,现在我明白了您的意思。我会更新答案。