我有一系列值,如:
const arr = [1,2,3];
有什么方法可以使用解构来创建以下输出?如果没有,我在ES6(或更高版本)中最简单的方法是什么?
const obj = {
one: 1,
two: 2,
three: 3
};
我尝试了这个,但我想它不起作用,因为这是计算键的语法:
const arr = [1,2,3];
const obj = {
[one, two, three] = arr
};
答案 0 :(得分:19)
您不仅可以将变形分配给变量,还可以分配给现有对象:
const arr = [1,2,3], o = {};
({0:o.one, 1:o.two, 2:o.three} = arr);
这没有任何其他变量,重复性较低。但是,它还需要两个步骤,如果你非常特别的话。
我不确定这是否有帮助,因为你提到了计算属性?!
答案 1 :(得分:7)
我不相信有任何结构/解构解决方案只需一步即可完成。我想要一些类似in this question的东西。旧的:=
strawman proposal似乎没有新proposal list中的腿,所以我认为现在有很多活动。
This answer显示了一个非常简洁的两步版本。
但是如果它是两个步骤,你也可以使用一个简单的对象初始化器:
const arr = [1,2,3];
const obj = {
one: arr[0],
two: arr[1],
three: arr[2]
};
console.log(obj);
答案 2 :(得分:5)
通过解构,您可以创建新变量或分配给现有变量/属性。但是,您无法在同一语句中声明和重新分配。
const arr = [1, 2, 3],
obj = {};
[obj.one, obj.two, obj.three] = arr;
console.log(obj);
// { one: 1, two: 2, three: 3 }

答案 3 :(得分:1)
这回答了一个稍微不同的要求,但我来到这里寻找这个需求的答案,也许这将有助于处于类似情况的其他人。
给定一系列字符串:a = [' one',' two',' three'] 得到这个结果字典的一个很好的非嵌套非循环方式是什么:b = {one:' one',two:' two',three:' three&# 39; }?
const b = a.map(a=>({ [a]: a })).reduce((p, n)=>({ ...p, ...n }),{})
答案 4 :(得分:0)
使用解构分配可以从数组分配给对象
请尝试以下示例:
const numbers = {};
[numbers.one, numbers.two, numbers.three] = [1, 2, 3]
console.log(numbers)
归功于http://javascript.info/的男孩,在那里我找到了一个类似的例子。该示例位于左侧部分“分配给任何内容”中的http://javascript.info/destructuring-assignment
答案 5 :(得分:0)
您可以使用lodash的_.zipObject
轻松实现它const obj = _.zipObject(['one','two','three'], [1, 2, 3]);
console.log(obj); // { one: 1, two: 2, three: 3 }
答案 6 :(得分:0)
let distructingNames = ['alu', 'bob', 'alice', 'truce', 'truce', 'truce', 'truce', 'bob'];
let obj={};
distructingNames.forEach((ele,i)=>{
obj[i]=ele;
})
console.log('obj', obj)