以树形结构排列JSON
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"answers"previousOutputTypeActivitySeqMappingId"并将其推入一个名为项目
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;
}
相关文章:
- jQuery匹配JSON对象的部分文本
- 在循环中分配json值时,值被覆盖
- 需要帮助设置json数组
- 如何在Javascript中将JSon对象转换为数组
- 我可以在json对象中添加一个函数吗
- 使用JS将数组转换为json对象
- Javascript-如何读取json文件中的列并将其保存在Javascript数组中
- 使用JQuery解析JSON嵌套数组
- 如何在php中按元素按字母顺序排列json文件
- 以树形结构排列JSON
- 比较两个JSON数组并重新排列新的JSON数组格式
- 以表格格式排列JSON数据
- JQuery数组重新排列JSON对象
- 使用角foreach循环来重新排列JSON
- 需要重新排列JSON
- 根据值重新排列JSON的一部分
- JSON菜单按字母顺序排列
- 当数据不按顺序排列时,如何对数组中的json数据进行排序
- JSON数据按月排列/重新排序
- 如何按字母顺序排列JSON元素使用localeCompare()向下一级