簡體   English   中英

將一種形式的JSON數組數據轉換為另一種形式?

[英]Converting the one form of JSON Array Data to another?

我是軟件領域的新手。 我有一個對象的json數組

var treeObj = [
      {
        "name": "sriram",
        "refernce_id": "SAN001",
        "sponer_id": "SAN000"
      },
      {
        "name": "neeraja",
        "refernce_id": "SAN002",
        "sponer_id": "SAN001"
      },
      {
        "name": "upender",
        "refernce_id": "SAN003",
        "sponer_id": "SAN001"
      },
      {
        "name": "manoj",
        "refernce_id": "SAN004",
        "sponer_id": "SAN002"
      },
      {
        "name": "shirisha",
        "refernce_id": "SAN005",
        "sponer_id": "SAN002"
      },
      {
        "name": "ragu",
        "refernce_id": "SAN006",
        "sponer_id": "SAN003"
      },
      {
        "name": "santhu",
        "refernce_id": "SAN007",
        "sponer_id": "SAN003"
      }
    ];

在這里,我將上面的對象傳遞給一個函數。 在該函數中,我需要將每個對象中的引用ID與sponer_id進行比較,如果它們相等,則需要將它們推入一個稱為子對象的數組中,如下所示,然后再次需要在子數組中檢查該引用ID如果上面的對象的sponer_id中再次存在in,則需要將它們推入子數組中,使其包含reference_id的對象中。 最終的數組Object看起來像。

[
  {
    "name": "sriram",
    "parent": null,
    "children": [
      {
        "name": "neeraja",
        "parent": "sriram",
        "children": [
          {
            "name": "manoj",
            "parent": "neeraja"
          },
          {
            "name": "shirisha",
            "parent": "neeraja"
          }
        ]
      },
      {
        "name": "upender",
        "parent": "sriram",
        "children": [
          {
            "name": "ragu",
            "parent": "neeraja"
          },
          {
            "name": "santhu",
            "parent": "neeraja"
          }
        ]
      }
    ]
  }
]

此處sriram的treeObj參考ID在neeraja和upender對象中以sponer id的形式出現。 所以neeraja和upender成為sriram的孩子。 在treeObj的manoj和shirisha對象中,neeraja的reference_id以sponer_id的形式出現。 同時,該子對象可以有更多子對象,我們需要動態格式化該對象。

我寫的功能看起來像

var mainArr = [], subArrs = [], subObj={}, subIds = [], find = "SAN001";
    formatData(treeObj);
    function formatData(treeObj){debugger;
        var arr = [];
        for(var x=0; x<= treeObj.length-1; x++){debugger;
            var sampData = treeObj[x];
            if(find == sampData.sponer_id){
                arr.push(sampData.refernce_id);
                subArrs.push(sampData);
            }
        }
        subIds.push(arr);
        console.log(subIds);
        console.log(subArrs);
        formatData(subArrs);
    }

請指導我哪里出問題了。 提前致謝。

//1. find all items the have no parent and push them on a stack like so:

let stack = treeObj.reduce((list, item) => {
  if (<ids match>) list.push(item);
  return item;
}, []),

let result = [].concat(stack);

//2. while loop the stack:

while (stack.length > 0) {
  let item = stack.shift();

  item.children = treeObj.reduce((list, child) => {
    if (<ids match>) {
      list.push(child);
    }
    return list;
  }, []).map(child => {
      child.parent = item;
      stack.unshift(item);
      return child;
  });
}

return result;

UPDATE

因此,在»好的舊JS«中,並進行了一些改進:

var stack = treeObj.filter(function (item) { 
  return item.<parent_id> === item.<child_id> });

var result = [].concat(stack);

while (stack.length > 0) {
  var item = stack.shift();

  item.children = treeObj.filter(function (child) {
    return item.<id> === child.<parent_id>;
  });

  item.children.forEach(function (child) { stack.unshift(child) });
}

基本上:

  1. 找到根並將其保存在堆棧中
  2. while.length > 0

    1. shift()堆棧中的第一項
    2. 找到該項目的所有子項並在堆棧上unshift
  3. 完成

可以在循環中為項目添加父屬性或刪除不需要的屬性。 整個過程也可以使用遞歸來完成,但是我曾經因為這樣做而遇到了“太多的遞歸錯誤”,所以我更喜歡使用迭代方法。 當然,不是.reduce.filter.forEach ,你可以使用普通的循環,但我更喜歡一個實用的風格。 總而言之,無論您如何做,都沒有那么困難,只需找到所有要開始的元素,然后與所有孩子一起重復,依此類推。 通過while循環,可以找到所有子級,或者找到以該元素為根的整個子樹。

祝好運!

您基本上是在嘗試將數組轉換為n元樹。

將原始樹函數輸入到formatData中,將為您提供一個數組(arr),該數組具有所有以SAN001作為父對象的對象的referenceID,而另一個數組(subArrs)帶有所有sponerId為SAN001的子對象。

然后,將arr存儲在subIds,log subIds和subArr中,並繼續遞歸調用subArrs上的格式數據。 然后,檢查subArr哪些對象具有“ SAN001作為前置對象”(當時應為所有對象),然后將該對象推入subArr。 如果即時消息沒有弄錯,則會導致無限循環。

改進的起點:您“找到”變量不會更改,它已硬連線至“ SAN001”-當您100%確信根對象始終具有此referenceID時,這對於您的第一次旅行是可以的。 但是在第二步中,您要檢查哪些對象依賴於第二級元素,因此需要將find設置為相應的referenceId。

您的子目錄包含取決於SAN001的所有對象。 但是,在第二次及以后的旅行中,您不想在subArr中獲得SAN001的子項,而希望獲得對象的子項。 因此,您需要遍歷舊對象以在subArr中找到對象的子對象,而不是遍歷subArr尋找SAN001的子對象。

希望可以澄清一點。

進一步研究的提示:您基本上是在嘗試使用javascript“將數組轉換為n元樹”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM