ES6数组解构并分配给没有功能的对象

时间:2018-12-04 18:40:57

标签: javascript arrays ecmascript-6 destructuring

我想知道如果没有mapreduce或任何其他功能,是否可以使用此初步代码?

const arr1 = ['str', 'str2'];
let obj = {};
Object.assign(obj, [...arr1] : 'Value');
console.log(obj); // Expected output: { str1: 'Value', str2: 'Value' }

重点是将每个数组元素转换为对象键并为其分配一个静态值,而我引起注意的是,是否可以通过使用简单的语法并像伪代码一样对数组进行破坏来实现?由于我找不到任何有关此的信息,所以我只想清除这个问题。

3 个答案:

答案 0 :(得分:6)

您不能散布数组元素以将它们用作对象中单独属性的属性名称。

最简单的方法是在事实发生之后使用循环:

let obj = {};
for (const str of arr1) {
    obj[str] = 'Value';
}

实时示例:

const arr1 = ['str', 'str2'];
let obj = {};
for (const str of arr1) {
    obj[str] = 'Value';
}
console.log(obj); // Expected output: { str1: 'Value', str2: 'Value' }


但是,如果您想变得更“狂热”,则可以使用Object.assign和一堆临时对象,这些对象可以使用扩展符号和map和箭头功能:

let obj = {};
Object.assign(obj, ...arr1.map(str => ({[str]: 'Value'})));

另请参见Jared Smith的answer using fromEntries,该版本与此assign版本非常相似,但效率可能更高(仍然会创建许多不必要的临时对象,但会更有效地处理这些对象)。 / p>

实时示例:

const arr1 = ['str', 'str2'];
let obj = {};
Object.assign(obj, ...arr1.map(str => ({[str]: 'Value'})));
console.log(obj); // Expected output: { str1: 'Value', str2: 'Value' }


如果需要,您也可以将其插入reduce(因为几乎所有数组操作都可以插入reduce):

let obj = arr1.reduce((o, str) => {
    o[str] = 'Value';
    return o;
}, {});

实时示例:

const arr1 = ['str', 'str2'];
let obj = arr1.reduce((o, str) => {
    o[str] = 'Value';
    return o;
}, {});
console.log(obj); // Expected output: { str1: 'Value', str2: 'Value' }


然后(也许)使用逗号运算符,以便箭头功能可以使用简洁的正文:

let obj = arr1.reduce((o, str) => (o[str] = 'Value', o), {});

实时示例:

const arr1 = ['str', 'str2'];
let obj = arr1.reduce((o, str) => (o[str] = 'Value', o), {});
console.log(obj); // Expected output: { str1: 'Value', str2: 'Value' }


不过,我会保持简单,并使用循环。 :-)

答案 1 :(得分:4)

如果愿意,您可以使用新的Object.fromEntries

var obj = Object.fromEntries(arr.map(str => [str, "Value"]));

请注意,这是非常新的内容,可能需要填充。

答案 2 :(得分:1)

不可能散布一个值,并获得一个以此项为键和另一个值的对象。

您需要通过在数组中添加自定义生成器来获得具有所需内部空间的对象,该生成器会为每个项目重新调整对象。

const arr1 = ['str', 'str2'];

arr1[Symbol.iterator] = function* () {
    for (let i = 0; i < this.length; i++) yield { [this[i]]: 'Value' };
};

let obj = {};

Object.assign(obj, ...arr1);

console.log(obj);