从数据数组创建嵌套对象和数组

问题描述 投票:0回答:2

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);

无法为page1嵌套级别,我该怎么做?

expectedoutput = {
 user: ["manageuser", "createuser"],
 details: ["/user-details-data"],
 page1: {
    user: ["deletesupplier"]
  }
}
javascript
2个回答
4
投票

你必须使用递归

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)

这适用于任何深度,也可以将对象添加到数组,例如。 "user$test$test2"


1
投票

如果你可以使用Lodash或者至少从这个库中获取和设置然后函数将解决你的问题可能如下所示:

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;
    }, {});
  }
© www.soinside.com 2019 - 2024. All rights reserved.