转换和分组树对象中的字符串数组

Coverting and grouping an string array in a tree object

本文关键字:字符串 数组 对象 转换      更新时间:2023-09-26

我有以下数组:

var exampeInclude= [
  "Product",
  "Group",
  "Product.Tax",
  "Product.ProductUnit",
  "Product.Variant.Original",
  "Product.Variant.Original.Tax",
  "Product.Variant.Original.ProductUnit"
];

我需要从这个数组中得到以下结构:

 [
    {
        "Product": {
            "includes": [
                {
                    "Tax": {
                        "includes": []
                    }
                },
                {
                    "ProductUnit": {
                        "includes": []
                    }
                },
                {
                    "Variant": {
                        "includes": [
                            {
                                "Original": {
                                    "includes": [] //...
                                }
                            }
                        ]
                    }
                }
            ]
        }
    },
    {
        "Group": {
            "includes": []
        }
    }
]

有点像树形结构。但我没有得到正确的解决方案。我所尝试的一切都以有线foreach告终,这些foreach很快就无法调试。到目前为止,我最好的是一个简单的简化函数,但我如何实现split('.')到这个?需要递归吗?

我现在拥有的最好的:

var hist = exampeInclude.reduce(function (prev, item) { 
  if( item in prev ) prev[item] ++; 
  else prev[item] = 1; 
  return prev;  
}, {});
我知道它不多,但它很重要。但我认为reduce是一个很好的开始)

我将从路径构建一个树,最后添加中间的'includes'数组

function buildFromPath(tree, pathVar){
  var a = pathVar.split('.'),
     parent = tree;
  for(var i = 0, max = a.length; i < max; i++){
     var n = a[i];
     if(!(n in parent))   parent[n] = {};
     parent = parent[n];
  }
}
var exampeInclude= [
  "Product",
  "Group",
  "Product.Tax",
  "Product.ProductUnit",
  "Product.Variant.Original",
  "Product.Variant.Original.Tax",
  "Product.Variant.Original.ProductUnit"
],
tree = {};
for(var i = 0, max = exampeInclude.length; i < max; i++){
   buildFromPath(tree, exampeInclude[i]);
}
// normally here you should have a tree structure
// like {Product:{Tax:{},ProductUnit:{},Variant:{Original:{Tax:{},ProductUnit:{}}}},Group:{}}
// then you parse the tree and add format with intermediates
function formatObj(obj){
   var res = [];
   for(var name in obj){
     var o = obj[name];
     res.push(o);
     o.includes = formatObj(o);
   }
   return res;
}
var res = formatObj(tree);