数据格式问题:数组到对象。任何简单的方法?

时间:2015-04-16 09:43:10

标签: javascript arrays object formatting

我试图将数组格式化为对象。它工作正常,但我需要知道,这是正确还是错误?还有其他任何标准方法吗?。

我使用了underscoreJS。

//我从API获得的内容

“A / a / 1”= A - >类别,a - >子类别,1 - >子类别的孩子。

["A", "A/a", "A/b", "A/a/1", "A/a/2", "B", "B/a"];

//我需要哪种格式。

[
   {
      "name":"A",
      "parent":"",
      "children":[
         {
            "name":"a",
            "parent":"A",
            "children":[
               {
                  "name":"1",
                  "parent":"a",
                  "children":[

                  ]
               },
               {
                  "name":"2",
                  "parent":"a",
                  "children":[

                  ]
               }
            ]
         },
         {
            "name":"b",
            "parent":"A",
            "children":[

            ]
         }
      ]
   },
   {
      "name":"B",
      "parent":"",
      "children":[
         {
            "name":"a",
            "parent":"B",
            "children":[

            ]
         }
      ]
   }
]

我的代码:

var dataObj = function(){
        this.name = "";
        this.parent = "";
        this.administrator = "";
        this.children = [];
      };


  var d_ = []; 

  _.each(data, function(item, index){

        var row = new dataObj();
        var item_array = item.split("/"),
            item_array_length = item_array.length;

          if(item_array.length  == 1){

            row.name = item_array[0];
            d_.push(row);

          } else {

              row.name = item_array[1];
              row.parent = item_array[0];
              var newC = d_[_.findIndex(d_, {name:item_array[0]})];

            if(item_array.length  == 2) {

              newC.children.push(row);

            } else if(item_array.length  == 3) {


              newC.children[_.findIndex(newC.children, {name: item_array[1]})]
                  .children.push({name : item_array[2], parent : item_array[1]});


            }


          }

  });

更新 子类别的级别不受限制。 “A / A / 1 / I / N / X / Y ...。”

1 个答案:

答案 0 :(得分:2)

我觉得你的实施可以改进。以下是几种可能性:

  1. 为了缩短处理时间,API的返回数据结构可以采用["A/b", "A/a/1", "A/a/2", "B/a"]而不是["A", "A/a", "A/b", "A/a/1", "A/a/2", "B", "B/a"]
  2. 的形式
  3. _库似乎没有多大帮助,代码可以用普通的javaScript实现。
  4. 可以使实现足够通用,以处理任何级别的嵌套子级。目前的实施仅限于第3级。
  5. 我能想到的一个简单算法包括以下高级步骤:

    1. 让我们将API提供的数据称为sampleArray
    2. 对于sampleArray的每个元素,我们都有currentSplittedElementArray = sampleArray[i].split('/');
    3. 让我们将所需的输出称为finalOutput
    4. 循环浏览finalOutput并测试该元素是否已存在finalOutput[i].name === currentSplittedElementArray[0]
    5. 如果元素已经存在,那么让我们遍历currentSplittedElementArray并使用finalOutput元素更新currentSplittedElementArray的相同元素。 (如果finalOutput上尚未显示该元素,则首先在finalOutput上创建元素并使用currentSplittedElementArray
    6. 元素填充该元素

      我知道上面的算法可能看起来令人生畏,所概述的步骤将包括在循环中重复调用函数或使用某种递归。但如果我要实现这样的话,我会做的就是这样。

      我对我的方法中的任何改进/优化领域持开放态度。