将对象数组转换为对象

共7个回答,已解决, 标签: javascript arrays object ecmascript-6

我有一个大致如下所示的分支数组:

让分支 = [
{
Id: 21,
姓名: “1 号支部”,
打开 _ times: [{} 、 {}//对象数组 (星期一、星期二等)
},
{
Id: 22,
2 号分店名称
打开 _ times: [{} 、 {}//对象数组 (星期一、星期二等)
},
//..等
]

但是我想把它变成一个以名字为每个对象的键的对象。

期望输出:

分支 = {
【分支 1 】: {
Id: 21,
打开 _ times: [{} 、 {}//对象数组 (星期一、星期二等)
},
【分支 2 】: {
Id: 22,
打开 _ times: [{} 、 {}//对象数组 (星期一、星期二等)
}
}

尝试过:

让 newBranches = 枝头.图 (支 => (
{
【支部名称】: {
Id: 分公司 id
天支.opening_times
}
}
);
控制台日志 (新分支)

但是当然,映射给了我一个数组输出:

[
0: {分支 1: {…}}
1: {分支 2: {…}}
]

有人能帮我指出正确的方向来获得一个新的对象吗name作为对象本身的 key?

第1个答案(采用)

我只是用一个简单的for-of loop. You'll get reduce answers, but all reduce这里做的是增加复杂性。

Const 结果 = {};
对于分支的 (const {name,id,opening_times}) {
结果 [名称] = {id,opening_times};
}

现场示例:

让分支 = [
{
Id: 21,
姓名: “1 号支部”,
打开 _ times: [{} 、 {}//对象数组 (星期一、星期二等)
},
{
Id: 22,
姓名: “2 号支部”,
打开 _ times: [{} 、 {}//对象数组 (星期一、星期二等)
},
//..等
];
Const 结果 = {};
对于分支的 (const {name,id,opening_times}) {
结果 [名称] = {id,opening_times};
}
控制台日志 (结果);
。作为控制台包装 {
最大高度: 100%!重要的;
}

添加到代码狂人的建议使用 rest 的方法:

Const 结果 = {};
对于 (const {name,。分支机构的入口}) {
结果【姓名】 = 录入;
}

现场示例:

让分支 = [
{
Id: 21,
姓名: “1 号支部”,
打开 _ times: [{} 、 {}//对象数组 (星期一、星期二等)
},
{
Id: 22,
姓名: “2 号支部”,
打开 _ times: [{} 、 {}//对象数组 (星期一、星期二等)
},
//..等
];
Const 结果 = {};
对于 (const {name,。分支机构的入口}) {
结果【姓名】 = 录入;
}
控制台日志 (结果);
。作为控制台包装 {
最大高度: 100%!重要的;
}

这些略有不同,因为第一个明确只使用id and opening_times in the result, but the rest version uses all properties other than name。当然,可读性 (显式和隐式) 有所不同,但是我可以使用每个地方。

第2个答案

用简单的reduce()操作和对象结构化:

康斯特分行 = [{
Id: 21,
姓名: “1 号支部”,
开放时间: []
},
{
Id: 22,
姓名: “2 号支部”,
开放时间: []
}
];

Reduce 结果 = branches.reduce (a,{name,。..V}) => (a [名称] = v,a),{});
第3个答案

您可以通过使用想要的键传播新对象来分配所有对象name和对象的其余部分。

让 branches = [{id: 21,名称: “Branch 1”,opening_times: [{},{},{}]},{id: 22,名称: [{},{},{}}],
New branches = Object.assign ({},.分支...O}) => ({[名称]: o});

(即将到来)Object.fromEntries

让 branches = [{id: 21,名称: “Branch 1”,opening_times: [{},{},{}]},{id: 22,名称: [{},{},{}}],
NewBranches = Object.fromEntries (分支.map ({name,。..O}) => [名称,o));

第4个答案

ES 2019 草案提供Object.fromEntries为此目的:

结果 = Object.fromEntries (分支.map (({name,.rest}) => [name,rest]))

它已经在大多数浏览器中实现,但是 polyfill 很容易:

对象。 fromEntries = iter =>
对象。分配 ({},
。.[.Iter].地图 (
([K,v]) => ({[k]: v})
);
第5个答案

你可以用reduce

让 branches = [{id: 21,名称: “Branch 1”,opening_times: [{},{},{}]},{id: 22,名称: [{},{},{}}];
Reduce res = branches.reduce (acc,{name,..Rest} => (acc [名称) = {。..休息},acc),{});
控制台日志 (res);
.as-console-wrapper { max-height: 100% !important; top: auto; }

ES5 语法:

Var branches = [{id: 21,名称: “Branch 1”,opening_times: [{},{},{}]},{id: 22,名称: [{},{},{}}];
Var res = reduce.reduce (函数 (acc,curr) {
Acc [curr.name] = {id: curr.id,opening_times: curr.opening_times};
返回 acc;
},{});
控制台日志 (res);
.as-console-wrapper { max-height: 100% !important; top: auto; }
第6个答案
让分支 = [{
Id: 21,
姓名: “1 号支部”,
打开 _ times: [{} 、 {}//对象数组 (星期一、星期二等)
},
{
Id: 22,
姓名: “2 号支部”,
打开 _ times: [{} 、 {}//对象数组 (星期一、星期二等)
}
]

让 new branches = {};
分支.forEach (el) => {
新分支机构 [名称] = {
身份证号码: el。
Opening_times: el.opening_times
};
});
第7个答案

你可以试试这个

对象。分配 ({},。..数组.map (item => ({[item.name]: item}));

相关问题

如何从异步调用返回响应? 循环中的 JavaScript 闭包--简单的实际示例 如何从异步调用返回响应? "注意: 未定义的变量"、"注意: 未定义的索引" 和 "注意: 未定义的偏移量" 使用 PHP 删除数字数组中的所有重复数字 [重复] 使用数组中的键获取最小值 根据值从对象数组中选择属性: Javascript 将对象数组转换为对象 在 Javascript 中合并两个对象数组 如何在解构的同时将字符串解析为数字?