[英]Arrange JSON in tree structure
我有一個普通的JSON,包含了其依賴對象的ID。
var array1=
[
{
"id": 84,
"outputTypeId": 900000000000002,
"previousOutputTypeActivitySeqMappingId": null,
"isRemoved": false,
"isPrimary": false
},
{
"id": 95,
"outputTypeId": 900000000000002,
"previousOutputTypeActivitySeqMappingId": 84,
"isRemoved": false,
"isPrimary": false
},
{
"id": 150,
"outputTypeId": 900000000000002,
"previousOutputTypeActivitySeqMappingId": 95,
"isRemoved": false,
"isPrimary": false
},
{
"id": 160,
"outputTypeId": 900000000000002,
"previousOutputTypeActivitySeqMappingId": 95,
"isRemoved": false,
"isPrimary": false
}
]
我想通過識別“ id”和“ previousOutputTypeActivitySeqMappingId”並將其推入名為items的新數組中,將其轉換為以下格式
var array1=
[{
"id": 84,
"outputTypeId": 900000000000002,
"previousOutputTypeActivitySeqMappingId": null,
"isRemoved": false,
"isPrimary": false,
"items": [
{
"id": 95,
"outputTypeId": 900000000000002,
"previousOutputTypeActivitySeqMappingId": 84,
"isRemoved": false,
"isPrimary": false,
"items": [
{
"id": 150,
"outputTypeId": 900000000000002,
"previousOutputTypeActivitySeqMappingId": 95,
"isRemoved": false,
"isPrimary": false,
"items": []
},
{
"id": 160,
"outputTypeId": 900000000000002,
"previousOutputTypeActivitySeqMappingId": 95,
"isRemoved": false,
"isPrimary": false,
"items": []
}
]
}
]
}]
我嘗試的代碼如下:我首先以新格式創建了一個虛擬對象:
var dummyObj= {
"id": 84,
"outputTypeId": 900000000000002,
"previousOutputTypeActivitySeqMappingId": null,
"isRemoved": false,
"isPrimary": false
}
function populateObj(array1, arrObj) {
for (var i = 0; i < array1.length; i++) {
if (array1[i].id == arrObj.parentActivityId) {
array1[i].items.push(arrObj);
} else {
populateObj(array1[i].items, arrObj);
}
}
};
populateObj(dummyObj);
由於我不想在一開始就對一個虛擬對象進行硬編碼。 有什么方法可以使用javascript實現此轉換?
謝謝。
使用一些功能和一點遞歸就可以很容易地做到這一點。
第一個函數將整個源數組作為一個源對象,並添加items
屬性:
function createObject(sourceArray, obj)
{
obj.items = createArray(sourceArray, obj.id);
return obj;
}
依次使用另一個函數為子級過濾源數組:
function createArray(sourceArray, id){
return sourceArray.filter(function(e){
return e.previousOutputTypeActivitySeqMappingId == id;
})
.map(function(e){
return createObject(sourceArray,e);
})
}
您會注意到,在tun中,它回調了createObject
函數以遞歸方式繼續構建樹。
最后一部分是通過查找具有null
父值的項目來解決所有問題
var result = createArray(input,null);
實時示例: https : //jsfiddle.net/3epjb93j/
function group(arr) {
var t={};
arr.forEach(function(obj) {
if (!obj.id) throw 'object found without id!';
t[obj.id]=obj;
});
var result=[];
arr.forEach(function(obj) {
if (!obj.previousOutputTypeActivitySeqMappingId) {
result.push(obj);
} else {
var parent=t[obj.previousOutputTypeActivitySeqMappingId];
if (!parent) throw('parent with id '+obj.previousOutputTypeActivitySeqMappingId+' not found!');
var items=parent.items;
if (!items) {
items=[];
parent.items=items;
}
items.push(obj);
}
});
return result;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.