js下json结构转换,搞了2天整蒙圈了,求帮助?

var list = [

{title:"xxxx",level:0},

{title:"xxxx",level:0},

{title:"xxxx",level:1},

{title:"xxxx",level:1},

{title:"xxxx",level:1},

{title:"xxxx",level:2},

{title:"xxxx",level:2},

{title:"xxxx",level:1},

{title:"xxxx",level:1},

{title:"xxxx",level:0},

{title:"xxxx",level:1},

{title:"xxxx",level:1},

{title:"xxxx",level:1},

{title:"xxxx",level:1},

{title:"xxxx",level:0},

{title:"xxxx",level:1},

{title:"xxxx",level:1},

{title:"xxxx",level:1},

{title:"xxxx",level:1},

{title:"xxxx",level:0},

{title:"xxxx",level:1},

{title:"xxxx",level:1},

{title:"xxxx",level:2},

{title:"xxxx",level:0},

];

这种数据结构,转换为下面这种结构的:

[

{

title:"xxxx",

items:[]

},

{

title:"xxxx",

items:[

{

title:"xxxx",

items:[]

},

{

title:"xxxx",

items:[]

},

{

title:"xxxx",

items:[

{

title:"xxxx",

items:[]

},

]

},

]

}

...

]

level代表层级,1属于上一个0的子集,2属于上一个1的子集。。。可能会有N级
谁能帮忙写出这个转换函数?


回答:

const list = [

{title:"xxxx",levle:0},

{title:"xxxx",levle:0},

{title:"xxxx",levle:1},

{title:"xxxx",levle:1},

{title:"xxxx",levle:1},

{title:"xxxx",levle:2},

{title:"xxxx",levle:2},

{title:"xxxx",levle:1},

{title:"xxxx",levle:1},

{title:"xxxx",levle:0},

{title:"xxxx",levle:1},

{title:"xxxx",levle:1},

{title:"xxxx",levle:1},

{title:"xxxx",levle:1},

{title:"xxxx",levle:0},

{title:"xxxx",levle:1},

{title:"xxxx",levle:1},

{title:"xxxx",levle:1},

{title:"xxxx",levle:1},

{title:"xxxx",levle:0},

{title:"xxxx",levle:1},

{title:"xxxx",levle:1},

{title:"xxxx",levle:2},

{title:"xxxx",levle:0},

];

function arrayToJson(list){

const length=list.length

let result=[]

for(let i=0;i<length;i++){

//为0直接压入

if(list[i].levle==0){

result.push({title:list[i].title,items:[]})

}else

{

//压入发生在结果数组尾端,取尾端最高级对象

let obj=result[result.length-1]

//若level大于1则循环赋值,找到应该被加入的items数组

if(list[i].levle>1) {

for (let j = 0; j < list[i].levle - 1; j++) {

//应被加入的items数组位于上一级items的末尾

obj = obj.items[obj.items.length - 1]

}

}

//此时无论level为1或是大于1,都已经找到了对应的items,push即可

obj.items.push({title:list[i].title,items:[]})

}

}

return result

}

let a = JSON.stringify(arrayToJson(list));

console.log(a);

js下json结构转换,搞了2天整蒙圈了,求帮助?
有\r\n是因为控制台复制了换行。我刚转js,语法用的es6标准。


回答:

代码

var list = [

{title:"xxxx",levle:0},

{title:"xxxx",levle:0},

{title:"xxxx",levle:1},

{title:"xxxx",levle:1},

{title:"xxxx",levle:1},

{title:"xxxx",levle:2},

{title:"xxxx",levle:2},

{title:"xxxx",levle:1},

{title:"xxxx",levle:1},

{title:"xxxx",levle:0},

{title:"xxxx",levle:1},

{title:"xxxx",levle:1},

{title:"xxxx",levle:1},

{title:"xxxx",levle:1},

{title:"xxxx",levle:0},

{title:"xxxx",levle:1},

{title:"xxxx",levle:1},

{title:"xxxx",levle:1},

{title:"xxxx",levle:1},

{title:"xxxx",levle:0},

{title:"xxxx",levle:1},

{title:"xxxx",levle:1},

{title:"xxxx",levle:2},

{title:"xxxx",levle:0},

]

var toTree = (list, levle = 0) => list.reduce((acc, cur, idx, arr) => (cur.levle == levle && acc.push({title: cur.title, levle: cur.levle, items: toTree(list.slice(idx + 1).map((item, _, array) => (item.levle == levle && (array.length = 0), item)), levle + 1)}), acc), []);

toTree(list);

结果

[

{

"title": "xxxx",

"levle": 0,

"items": []

},

{

"title": "xxxx",

"levle": 0,

"items": [

{

"title": "xxxx",

"levle": 1,

"items": []

},

{

"title": "xxxx",

"levle": 1,

"items": []

},

{

"title": "xxxx",

"levle": 1,

"items": [

{

"title": "xxxx",

"levle": 2,

"items": []

},

{

"title": "xxxx",

"levle": 2,

"items": []

}

]

},

{

"title": "xxxx",

"levle": 1,

"items": []

},

{

"title": "xxxx",

"levle": 1,

"items": []

}

]

},

{

"title": "xxxx",

"levle": 0,

"items": [

{

"title": "xxxx",

"levle": 1,

"items": []

},

{

"title": "xxxx",

"levle": 1,

"items": []

},

{

"title": "xxxx",

"levle": 1,

"items": []

},

{

"title": "xxxx",

"levle": 1,

"items": []

}

]

},

{

"title": "xxxx",

"levle": 0,

"items": [

{

"title": "xxxx",

"levle": 1,

"items": []

},

{

"title": "xxxx",

"levle": 1,

"items": []

},

{

"title": "xxxx",

"levle": 1,

"items": []

},

{

"title": "xxxx",

"levle": 1,

"items": []

}

]

},

{

"title": "xxxx",

"levle": 0,

"items": [

{

"title": "xxxx",

"levle": 1,

"items": []

},

{

"title": "xxxx",

"levle": 1,

"items": [

{

"title": "xxxx",

"levle": 2,

"items": []

}

]

}

]

},

{

"title": "xxxx",

"levle": 0,

"items": []

}

]


回答:

var data = [

{title:"xxxx",level:0},

{title:"xxxx",level:0},

{title:"xxxx",level:1},

{title:"xxxx",level:1},

{title:"xxxx",level:1},

{title:"xxxx",level:2},

{title:"xxxx",level:2},

{title:"xxxx",level:1},

{title:"xxxx",level:1},

{title:"xxxx",level:0},

{title:"xxxx",level:1},

{title:"xxxx",level:1},

{title:"xxxx",level:1},

{title:"xxxx",level:1},

{title:"xxxx",level:0},

{title:"xxxx",level:1},

{title:"xxxx",level:1},

{title:"xxxx",level:1},

{title:"xxxx",level:1},

{title:"xxxx",level:0},

{title:"xxxx",level:1},

{title:"xxxx",level:1},

{title:"xxxx",level:2},

{title:"xxxx",level:0},

];

function formatData (data) {

let levelMap = [],

result = [];

data.forEach(obj => {

levelMap[obj.level] = obj;

let parentLevel = obj.level - 1;

if (parentLevel === -1) {

return result.push(obj);

}

let parentObj = levelMap[parentLevel];

if (!parentObj) {

return;

}

parentObj.items = parentObj.items || [];

parentObj.items.push(obj);

});

return result;

}

console.log(formatData(data))


回答:

对最近的层级对象进行入栈即可,简单好理解的算法。
复杂度为 O(n);

const toTree = (list) => {

list[0].item = [];

const res = [list[0]];

const stack = [list[0]];

for (let i = 1; i < list.length; i++) {

const item = list[i];

item.items = [];

stack[item.levle] = item;

if( !item.levle ) {

res.push( item );

continue;

}

stack[item.levle-1].items.push(item);

}

return res;

}


回答:

function fn(data, lev = 0) {

let arr = []

arr = data.filter((item) => {

return item.levle === lev

})

if (arr.length !== 0) {

// 为了区别添加了levle

arr = arr.map((item) => {

return { title: item.title, levle: item.levle, items: [] }

})

arr[arr.length - 1].items = fn(data, ++lev)

}

return arr

}

fn(list)


回答:

var list = [

{title:"xxxx",levle:0},

{title:"xxxx",levle:0},

{title:"xxxx",levle:1},

{title:"xxxx",levle:1},

{title:"xxxx",levle:1},

{title:"xxxx",levle:2},

{title:"xxxx",levle:2},

{title:"xxxx",levle:1},

{title:"xxxx",levle:1},

{title:"xxxx",levle:0},

{title:"xxxx",levle:1},

{title:"xxxx",levle:1},

{title:"xxxx",levle:1},

{title:"xxxx",levle:1},

{title:"xxxx",levle:0},

{title:"xxxx",levle:1},

{title:"xxxx",levle:1},

{title:"xxxx",levle:1},

{title:"xxxx",levle:1},

{title:"xxxx",levle:0},

{title:"xxxx",levle:1},

{title:"xxxx",levle:1},

{title:"xxxx",levle:2},

{title:"xxxx",levle:0},

];

let cleanDataFS = (data, dataO) => {

let datalist = data,

dataObj = [];

if(!datalist[0].id){

let parentIdFS = (num, dataitem)=>{

for (let index = num; index > 0; index--) {

const element = datalist[index];

if(dataitem.levle > element.levle){

return element.id;

}

}

}

for (let index = 0; index < datalist.length; index++) {

const element = datalist[index];

datalist[index].id = 'indexId_' + index;

if(index){

datalist[index].parentId = parentIdFS(index, datalist[index])

}

}

}

let dataObjFS = (dataVal, dataItem)=>{

for (let index = 0; index < dataVal.length; index++) {

const element = dataVal[index];

if(element.id == dataItem.parentId){

element.items.push({

...dataItem,

items: [],

})

}else{

dataObjFS(element.items, dataItem)

}

}

}

for (let index = 0; index < datalist.length; index++) {

const element = datalist[index];

if(!datalist[index].parentId){

dataObj.push({...element, items:[]});

}else{

dataObjFS(dataObj, element);

}

}

return JSON.stringify(dataObj);

}

"[{\"title\":\"xxxx\",\"levle\":0,\"id\":\"indexId_0\",\"items\":[]},{\"title\":\"xxxx\",\"levle\":0,\"id\":\"indexId_1\",\"items\":[{\"title\":\"xxxx\",\"levle\":1,\"id\":\"indexId_2\",\"parentId\":\"indexId_1\",\"items\":[]},{\"title\":\"xxxx\",\"levle\":1,\"id\":\"indexId_3\",\"parentId\":\"indexId_1\",\"items\":[]},{\"title\":\"xxxx\",\"levle\":1,\"id\":\"indexId_4\",\"parentId\":\"indexId_1\",\"items\":[{\"title\":\"xxxx\",\"levle\":2,\"id\":\"indexId_5\",\"parentId\":\"indexId_4\",\"items\":[]},{\"title\":\"xxxx\",\"levle\":2,\"id\":\"indexId_6\",\"parentId\":\"indexId_4\",\"items\":[]}]},{\"title\":\"xxxx\",\"levle\":1,\"id\":\"indexId_7\",\"parentId\":\"indexId_1\",\"items\":[]},{\"title\":\"xxxx\",\"levle\":1,\"id\":\"indexId_8\",\"parentId\":\"indexId_1\",\"items\":[]}]},{\"title\":\"xxxx\",\"levle\":0,\"id\":\"indexId_9\",\"items\":[{\"title\":\"xxxx\",\"levle\":1,\"id\":\"indexId_10\",\"parentId\":\"indexId_9\",\"items\":[]},{\"title\":\"xxxx\",\"levle\":1,\"id\":\"indexId_11\",\"parentId\":\"indexId_9\",\"items\":[]},{\"title\":\"xxxx\",\"levle\":1,\"id\":\"indexId_12\",\"parentId\":\"indexId_9\",\"items\":[]},{\"title\":\"xxxx\",\"levle\":1,\"id\":\"indexId_13\",\"parentId\":\"indexId_9\",\"items\":[]}]},{\"title\":\"xxxx\",\"levle\":0,\"id\":\"indexId_14\",\"items\":[{\"title\":\"xxxx\",\"levle\":1,\"id\":\"indexId_15\",\"parentId\":\"indexId_14\",\"items\":[]},{\"title\":\"xxxx\",\"levle\":1,\"id\":\"indexId_16\",\"parentId\":\"indexId_14\",\"items\":[]},{\"title\":\"xxxx\",\"levle\":1,\"id\":\"indexId_17\",\"parentId\":\"indexId_14\",\"items\":[]},{\"title\":\"xxxx\",\"levle\":1,\"id\":\"indexId_18\",\"parentId\":\"indexId_14\",\"items\":[]}]},{\"title\":\"xxxx\",\"levle\":0,\"id\":\"indexId_19\",\"items\":[{\"title\":\"xxxx\",\"levle\":1,\"id\":\"indexId_20\",\"parentId\":\"indexId_19\",\"items\":[]},{\"title\":\"xxxx\",\"levle\":1,\"id\":\"indexId_21\",\"parentId\":\"indexId_19\",\"items\":[{\"title\":\"xxxx\",\"levle\":2,\"id\":\"indexId_22\",\"parentId\":\"indexId_21\",\"items\":[]}]}]},{\"title\":\"xxxx\",\"levle\":0,\"id\":\"indexId_23\",\"items\":[]}]"

最传统的写法,可以自己优化一下


回答:

levle是拼错了吧

function buildTree(list) {

const root = [];

const path = [];

let currentNode = root;

for (const item of list) {

if (item.level < path.length) {

while (item.level !== path.length) {

currentNode = path.pop();

}

} else if (item.level === path.length + 1) {

path.push(currentNode);

currentNode = currentNode[currentNode.length - 1].items;

} else if (item.level !== path.length) {

throw new Error('数据有问题')

}

currentNode.push({

title: item.title,

items: []

});

}

return root;

}


回答:

这个需求我前几天也与遇到了,我觉得作者和我的需求应该是一样的
可以看下我的这篇文章:Javascript提取文章中的h标签生成文章目录


回答:

这有问题吧,只有层级,没有具体的父节点信息


回答:

考虑每次循环时返回当前的祖先链,这样方便最快查找到父节点

function toTree(arr) {

const res = []

arr.reduce((pre, curr) => {

curr.items = []

if (curr.levle === 0) {

res.push(curr)

return [curr]

}

for (let i = pre.length - 1; i > -1; i--) {

if (curr.levle === pre[i].levle + 1) {

pre[i].items.push(curr)

pre.length = i + 1

pre.push(curr)

break

}

}

return pre

}, null)

return res

}


回答:

不太理解题主的表述,level为0的项有N个,那么最终的数据结构中,有N个level为0的项下的节点是一样的?


回答:

1属于上一个0的子集,楼主表述的是什么意思,1属于上一个临近的0的子集吗,还是level为0的节点,都是一样的

以上是 js下json结构转换,搞了2天整蒙圈了,求帮助? 的全部内容, 来源链接: utcz.com/p/936054.html

回到顶部