Reputation: 9105
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
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
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