javascript - 数据格式化问题 : Array to Object. 有什么简单的方法吗?

标签 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. 为了减少处理时间,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. _ 库似乎没有多大帮助,代码可以用纯 javaScript 实现。
  3. 可以使实现足够通用以处理任何级别的嵌套子项。当前的实现仅限于第 3 级。

我能想到的一个简单算法将包含以下高级步骤:

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

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

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

关于javascript - 数据格式化问题 : Array to Object. 有什么简单的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29670944/

相关文章:

c++ - 如何在运行时从 C++ 中的 DLL 文件创建对象?

javascript - fancytree 拖放 - 获取当前元素

javascript - 访问对象内部的数组

c# - 无法在 LINQ to Entities 查询中初始化实现 IEnumerable 'System.Collections.Generic.List` 1' 的类型

javascript - 如何在 OOP 类中更新对象 json

JavaScript - 如何创建一个包含引用对象的数组?

javascript - 运行 mongoDB shell 的 JavaScript 引擎是什么?

javascript - 每次单击链接时都会出现脚本错误

javascript - 当迭代数组并打印键和值时,还包括 __proto__ 函数,为什么?

android - 如何使用 edittext 验证 json 数组