convert set to object

Viewed 2794

I have a set which needs to be converted into an object with the set's unique values as the object keys and an empty string as each element's value in the object.

Here is the set I'm working with:

const uom = new Set(['inches', 'centimeters', 'yards', 'meters']);

I've tried this:

const uomObj = {...[...uom]};
console.log(uomObj);

Which yields this:

Object {
  "0": "inches",
  "1": "centimeters",
  "2": "yards",
  "3": "meters",
}

but that does not match the desired result of:

Object {
  "inches": "",
  "centimeters": "",
  "yards": "",
  "meters": "",
}

Can this be achieved with an ES6 approach? If so, how?

5 Answers

You can use Array.from with a mapping function to convert each value inside your set into an object and then use Object.assign() with the spread syntax to merge the array of objects into a single resulting object like so:

const uom = new Set(['inches', 'centimeters', 'yards', 'meters']);
const res = Object.assign(...Array.from(uom, v => ({[v]:''})));
console.log(res);

Create an object, then loop over the values in the set and create a property for each one. The reduce method is probably the most compact way to do that.

const uom = new Set(['inches', 'centimeters', 'yards', 'meters']);
const result = Array.from(uom).reduce( (a,c) => { a[c]=""; return a; }, {});
console.log(result);

Here's one way:

[...uom].reduce((o, u) => {
  o[u] = '';
  return o;
}, {})

You can use Array.prototype.reduce to get the elements from the set and accumulate it in an object:

const uom = new Set(['inches', 'centimeters', 'yards', 'meters']);
const getObjectFromSet = (set) => {
return [...set].reduce((r, k) => {r[k] = ""; return r; },{});
}
console.log(getObjectFromSet(uom));

You can also use the Object.fromEntries for ES6+ code:

const uom = new Set(['inches', 'centimeters', 'yards', 'meters']);
const getObjectFromSet = (set) => {
  return Object.fromEntries(Array.from(set, (k) => [k, ""]));
}
console.log(getObjectFromSet(uom));

For anyone like myself who was looking for the reverse of this for something similar to the below

 Object {
  "length": "inches",
  "length": "centimeters",
  "length": "yards",
  "length": "meters",
    }

This code worked for me

        const mySet = new Set(['inches', 'centimeters', 'yards', 'meters']);
        let newArr = [];

        const setToObj = [...mySet].map(el => {
          newArr.push({ 'length': el });
        });
Related