代码之家  ›  专栏  ›  技术社区  ›  Learner

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

  •  0
  • Learner  · 技术社区  · 6 年前

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

    无法嵌套第1页的级别,我该怎么做?

    expectedoutput = {
     user: ["manageuser", "createuser"],
     details: ["/user-details-data"],
     page1: {
        user: ["deletesupplier"]
      }
    }
    
    0 回复  |  直到 6 年前
        1
  •  4
  •   Ziarno    6 年前

    你必须使用递归

    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"

        2
  •  1
  •   Hakier    6 年前

    如果你能使用 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;
        }, {});
      }