Javascript(ES6)将值设置为普通对象

时间:2017-10-25 10:28:16

标签: javascript ecmascript-6 set

如何将Javascript ES6 Set包装器的值转换为普通的Object?特别是:最快/最短的方式是什么?

我正在寻找适用于阵列的以下内容:

const myArray = Array.from(mySet);

我徒劳地尝试了:

// mySet variable is Set containing integers {1, 2, 3, ..., n}

Object.assign({}, mySet);
Object.assign({}, mySet.values());
Object.assign({}, mySet.entries());

最后,我正在考虑创建一个新对象,迭代该集合并将其条目推送到新对象中。我想知道是否有一种更优雅的方式。

2 个答案:

答案 0 :(得分:1)

使用ES6传播语法:



var mySet = new Set([1, 2, 3]);
var myArray = [ ...mySet];
console.log(myArray);




编辑:要获取对象而不是数组,它应该是:



var mySet = new Set([1, 2, 3]);
var obj = {};
[ ...mySet].forEach(el => obj[el] = el);
console.log(obj);




答案 1 :(得分:0)

问题是Set返回一个Interactor,并且从技术上讲,没有键就没有对象。您需要为每个值分配一个键,最简单的方法是将其散布到新数组中,以便数组的索引成为键。

// returns { "0": 1, "1": 2, "2": 3, ..., "i": n }
{...{}, ...[...mySet]};

// Same as above.
Object.assign({}, Array.from(mySet));

但是,如果您希望对象中的键和值相同,则可以在解析的数组上运行reducer method,并将初始值作为返回的对象。

const myReducer = (acc, cur) => {
  // You don't need to stringify, if you can ensure it's always numbers.
  acc[JSON.stringify(cur)] = cur;
  return acc;
};

// Returns { "1": 1, "2": 2, "3": 3, ..., "n": n }
Array.from(mySet).reduce(myReducer, {});

// One liner, as per above, just less readable.
[...mySet].reduce((acc, cur) => !(acc[JSON.stringiy(cur)] = cur) || acc, {});

免责声明:由于Set可以在任何位置具有任何原始值,因此在为其分配对象时,键可能会变得有些疯狂。

// Returns { "1": 1, "{\"test1\":1}": { "test1": 1 } }
[...new Set([1, {test1:1}])].reduce(myReducer, {});