[英]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) });
}
基本上:
while.length > 0
shift()
堆棧中的第一項 unshift
完成
可以在循環中為項目添加父屬性或刪除不需要的屬性。 整個過程也可以使用遞歸來完成,但是我曾經因為這樣做而遇到了“太多的遞歸錯誤”,所以我更喜歡使用迭代方法。 當然,不是.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.