Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将对象数组转换为对象_Javascript_Arrays_Object_Ecmascript 6 - Fatal编程技术网

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 })));