Javascript 将对象数组转换为对象
我有一组分支,大致如下所示:Javascript 将对象数组转换为对象,javascript,arrays,object,ecmascript-6,Javascript,Arrays,Object,Ecmascript 6,我有一组分支,大致如下所示: let分支=[ { id:21, 名称:“分行1”, 打开时间:[{},{},{}]//对象数组(星期一、星期二等) }, { 身份证号码:22, 名称“分行2” 打开时间:[{},{},{}]//对象数组(星期一、星期二等) }, //等等 ] 但我想把它变成一个对象,每个对象的键都是这个名称 期望输出: 尝试: let newBranches=branchs.map(branch=>( { [分行名称]:{ id:branch.id, 天数:分行营业时间 }
let分支=[
{
id:21,
名称:“分行1”,
打开时间:[{},{},{}]//对象数组(星期一、星期二等)
},
{
身份证号码:22,
名称“分行2”
打开时间:[{},{},{}]//对象数组(星期一、星期二等)
},
//等等
]
但我想把它变成一个对象,每个对象的键都是这个名称
期望输出:
尝试:
let newBranches=branchs.map(branch=>(
{
[分行名称]:{
id:branch.id,
天数:分行营业时间
}
}
));
控制台日志(newBranches)
当然,映射给了我一个数组输出:
[
0:{分支1:{…}
1:{分支2:{…}
]
有谁能帮我指出正确的方向,用
名称
键作为对象本身来获取一个新对象吗?您可以通过使用名称
的所需键和对象的其余部分来分配所有对象
let branchs=[{id:21,name:“Branch 1”,开始时间:[{},{},{},{}]},{id:22,name:“Branch 2”,开始时间:[{},{},{},{}]},
newBranches=Object.assign({},…branchs.map({name,…o})=>({[name]:o}));
控制台.日志(newBranches)代码>
。作为控制台包装{max height:100%!important;top:0;}
您可以使用reduce
let branchs=[{id:21,name:“Branch 1”,开始时间:[{},{},{},{}]},{id:22,name:“Branch 2”,开始时间:[{},{},{}]};
const res=branchs.reduce((acc,{name,{rest})=>(acc[name]={……rest},acc),{});
控制台日志(res)代码>
。作为控制台包装器{max height:100%!important;top:auto;}
我只想使用一个简单的来实现of
循环。您将得到reduce
答案,但reduce
所做的只是增加复杂性
const result = {};
for (const {name, id, opening_times} of branches) {
result[name] = {id, opening_times};
}
实例:
let分支=[
{
id:21,
名称:“分行1”,
打开时间:[{},{},{}]//对象数组(星期一、星期二等)
},
{
身份证号码:22,
名称:"分行2",,
打开时间:[{},{},{}]//对象数组(星期一、星期二等)
},
//等等
];
const result={};
用于(分支的常量{name,id,打开次数}){
结果[名称]={id,打开次数};
}
控制台日志(结果)代码>
。作为控制台包装器{
最大高度:100%!重要;
}
let分支=[{
id:21,
名称:“分行1”,
打开时间:[{},{},{}]//对象数组(星期一、星期二等)
},
{
身份证号码:22,
名称:"分行2",,
打开时间:[{},{},{}]//对象数组(星期一、星期二等)
}
]
让newBranches={};
分支机构。forEach((el)=>{
纽伯兰奇[地名]={
id:el.id,
开启次数:el.开启次数
};
});
console.log(newBranches)
,具有简单的reduce()
操作和对象解构:
const分支=[{
id:21,
名称:“分行1”,
开盘时间:[]
},
{
身份证号码:22,
名称:"分行2",,
开盘时间:[]
}
];
const result=branchs.reduce((a,{name,{v})=>(a[name]=v,a),{});
控制台日志(结果)代码>ES 2019草案正是为此目的而规定的:
result = Object.fromEntries(branches.map(({name,...rest}) => [name, rest]))
它已经在大多数浏览器中实现,但polyfill很简单:
Object.fromEntries = iter =>
Object.assign({},
...[...iter].map(
([k, v]) => ({[k]: v})
));
你可以试试这个(ES6)
为什么你的每个答案都这么复杂,一个刚刚了解for循环的新用户甚至不会对这里发生的事情有一点概念,你能把事情简化一点吗?@Shubh我已经看到Nina Scholz的答案好几年了,它们始终是性能最好的,而且往往是任何给定问题的最具创造性的解决方案。Stack Overflow的目标不仅仅是成为初学者的知识库。@RobbyCornelissen,是的,这里也一样,但我想应该有一些详细说明或一些新用户的帮助链接,这只是拓宽了理解的视野。我喜欢与reduce方法相比的可读性。不过,有没有更快的方法呢?旁注:-我想我们可以在这里使用rest参数
,而不是取出所有属性,然后再次创建对象,即for(const{name,…rest}of branchs)
@EliNathan-在现代JavaScript引擎上,我认为这是一个清洗for of
创建并使用一个迭代器(需要优化,JavaScript引擎肯定能做到),它涉及函数调用reduce
不使用迭代器,而是调用回调函数。所以…@EliNathan-当然,你必须在分支中至少有上万个条目才有意义(或者你必须在一个紧密的循环中一遍又一遍地这样做)。为了这个问题的目的,我简化了分支
数组,实际上要在这里使用显式版本。它有很多我不需要添加到新对象中的东西。谢谢我想,定义一个全局变量并在循环中更改其值从来都不是一个好主意,如果我们有一个复杂的代码结构,这可能会导致错误的输出。您需要从值中删除name
属性,以匹配预期的输出为什么不只是a[name]=v
?@adiga OP表示name
属性不应该在value对象中。我的意思是(a[name]=v,a)
而不是(a[name]={…v},a)
@adiga我知道你的意思。这样做会在value对象中包含name
属性,但解构已经解决了这个问题,对吗v
已经是一个没有名称
属性的新对象{…v}
只是克隆v
Object.fromEntries = iter =>
Object.assign({},
...[...iter].map(
([k, v]) => ({[k]: v})
));
Object.assign({}, ...array.map(item => ({ [item.name]: item })));