Beginner
Beginner

Reputation: 9105

creating nested object and arrays from array of data

var resources = ["user$manageuser", "user$createuser", "details$/user-details-data", "page1$user$deletesupplier"]

var result = resources.reduce(
  (r, s) =>
  ((key, value) => Object.assign(r, {
    [key]: [].concat(r[key] || [], value)
  }))
  (...s.split('$')), {}
);
console.log(result);

not able to nest the level for page1, how can i do that one ?

expectedoutput = {
 user: ["manageuser", "createuser"],
 details: ["/user-details-data"],
 page1: {
    user: ["deletesupplier"]
  }
}

Upvotes: 0

Views: 77

Answers (2)

Ziarno
Ziarno

Reputation: 7562

you have to use recursion

const data = ["user$manageuser", "user$createuser", "details$/user-details-data", "page1$user$deletesupplier"]

function makeObject(resources, object = {}) {
  return resources.reduce((result, string) => {
    const [key, value] = string.split(/\$(.+)/)
    if (value && value.includes('$')) {
      result[key] = result[key] || {}
      makeObject([value], result[key])
    } else {
      result[key] = result[key] || []
      result[key].push(value)
    }
    return result
  }, object)
}

const res = makeObject(data)
console.log(res)

This works for any depth, and also you can add objects to array, ex. "user$test$test2"

Upvotes: 4

Hakier
Hakier

Reputation: 505

If You can use Lodash or at least get and set from this library then function what will solve your problem can look like this:

function transform(resources) {
    return resources.reduce((agg, resource) => {
      const splitted = resource.split('$');
      const keys = splitted.slice(0, splitted.length - 1);
      const value = splitted[splitted.length - 1];

      _.set(agg, keys, [...(_.get(agg, keys) || []), value]);


      return agg;
    }, {});
  }

Upvotes: 1

Related Questions