在 JavaScript 中将数组转换为对象
Posted
技术标签:
【中文标题】在 JavaScript 中将数组转换为对象【英文标题】:Transforming array into a object in JavaScript 【发布时间】:2018-08-21 15:32:30 【问题描述】:我正在尝试将一个数组转换为一个 javscript 对象,该对象旨在与 AngularJS 中的输入复选框一起使用。
这是我从后端获得的输入数组:
let selectedRolesDB = ['ADMIN', 'SECURITY'];
这是我的前端所期望的:
let selectedRoles =
'ADMIN' : true,
'SECURITY': true
;
我尝试了不同的方法,例如 angular.forEach,但问题是我无法获得所需的输出:
angular.forEach(selectedRolesDB,(value, key) =>
this.selectedRoles.push(value : true );
);
谁能告诉我如何最好地解决我的问题,以便我最终得到前端期望的数组?
JSFiddle
【问题讨论】:
【参考方案1】:selectedRoles
不是数组,它是对象。将其初始化为空对象:
let selectedRoles = ;
angular.forEach(selectedRolesDB,(value, key) =>
// use [] notation to add property with required name and value
selectedRoles[value] = true;
);
【讨论】:
【参考方案2】:使用array.reduce
:
let selectedRolesDB = ['ADMIN', 'SECURITY'];
const newArray = selectedRolesDB.reduce((accumulator, value) =>
accumulator[value] = true;
return accumulator;
, );
console.log(newArray)
有关它的文档,请参阅 https://developer.mozilla.org/en-US/docs/Web/javascript/Reference/Global_Objects/Array/reduce。
【讨论】:
问题是用打字稿标记的,对于打字稿,你还应该根据编译器标志声明累加器的类型,否则你会得到一个错误:const newArray = selectedRolesDB.reduce< [role: string]: boolean >((accumulator, value) => accumulator[value] = true; return accumulator; , );
确实,@TitianCernicova-Dragomir,但是(根据问题中提供的代码),ts 编译器不使用任何特定的标志,而且看起来非常宽松(我们也不能在打字稿:()【参考方案3】:
使用数组的原生 'forEach' 方法可能会更好(它具有良好的浏览器支持,请参见此处Array forEach)。如果您决定将项目迁移到 Angular2+,这也会很有帮助,因此避免使用“angular.someMethod”是一种更好的方法。 这是最终的解决方案:
const selectedRoles: [key: string]: boolean = ;
selectedRolesDB.forEach((value: string) => selectedRoles[value] = true);
【讨论】:
以上是关于在 JavaScript 中将数组转换为对象的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Javascript 中将表单数组转换为 JSON? (对象数组)?
在Javascript中将对象转换为包含多个对象的数组的理想方法是啥? (允许 ES6)