js基本数据结构转换

240 阅读2分钟

数组转链表

数组转链表基本思路

1.构造根节点

2.root之乡根节点

3进入循环

3.1 next节点构造

3.2 当前节点的.next指向next

3.3当前节点指向下个节点

4.返回根节点

function listNodeToArr(head){
    const arr = []
    while(head) {
        arr.push(head.val);
        head = head.next
    }
    return arr
}

变型-对象转单树

// 原数据
{
    "province": "浙江", "city": "杭州", "name": "西湖"
}
// 目标数据
{
  value:'浙江',
  children:[
   {
    value:'杭州',
    children:[
     {
      value:'西湖'
     }
    ]
   }
  ]
}
// 和构造链表的思路一样,1.next赋值 2.将next嵌入head 3.head指针下移
function objToLists(obj) {
    const keys = [...level];
    let head = {value: obj[keys.shift()]}
    const root = head;
    let next = {}
    while(keys.length) {
        next = {value: obj[keys.shift()]}
        head.children = [next];
        head = next
    }
    return root;
}

数组转树

题型一

let input = [
    {
        id:1,val: '学校', parentId:null
    },
    {
        id:2,val: '班级1', parentId:1
    },
    {
        id:3,val: '班级2', parentId:1
    },
    {
        id:4,val: '学生1', parentId:2
    },
    {
        id:5,val: '学生2', parentId:3
    },
    {
        id:6,val: '学生3', parentId:3
    }
]
let output = {
    id:1,
    val: '学校',
    children: [
        {
            id:2,
            val: '班级1',
            children: [
                {
                    id: 4,
                    val: '学生1',
                    children:[]
                },
                {
                    id:5,
                    val: '学生2',
                    children: []
                }
            ]
        },
        {
            id: 3,
            val: '班级2',
            children:[
                {
                    id: 6,
                    val:'学生3',
                    children: []
                }
            ]
        }
    ]
}

递归求children

function arrTotree(array) {
    function findChildArr(pid) {
        const targetArray = array.filter(item=>item.parentId === pid);
        targetArray.forEach(item=>{
            delete item.parentId;
            item.children = findChildArr(item.id)
            if (!item.children || !item.children.length) {
                delete item.children
            }
        })
        return targetArray
    }
    return findChildArr(null)
}

题型二

const entries = [
    {
        "province": "浙江", "city": "杭州", "name": "西湖"
    }, {
        "province": "四川", "city": "成都", "name": "锦里"
    }, {
        "province": "四川", "city": "成都", "name": "方所"
    }, {
        "province": "四川", "city": "阿坝", "name": "九寨沟"
    }
];
const  result = [ {  value:'浙江',  children:[   {    value:'杭州',    children:[     {      value:'西湖'     }    ]
   }
  ]
 },
 {
  value:'四川',
  children:[
   {
    value:'成都',
    children:[
     {
      value:'锦里'
     },
     {
      value:'方所'
     }
    ]
   },
   {
    value:'阿坝',
    children:[
     {
      value:'九寨沟'
     }
    ]
   }
  ]
 }
]
const level = ["province", "city", "name"];
function arrayToLists(obj) {
    const keys = [...level];
    let head = {value: obj[keys.shift()]}
    const root = head;
    let next = {}
    while(keys.length) {
        next = {value: obj[keys.shift()]}
        head.children = [next];
        head = next
    }
    return root;
}
function listToTree(root, head) {
    if(!root || !head) {
        return;
    }
    const index = root.findIndex(item => item.value === head.value);
    if (index<0) {
        root.push(head)
    } else {
        listToTree(root[index].children, head.children[0])
    }
}

// 先构造单节点的数,在插到最终的树结构中
function arrTotree(entries) {
    const root = [];
    for (let i =0; i< entries.length; i++) {
        const list = arrayToLists(entries[i]);
        listToTree(root, list)
    }
    console.log(root)
}

高纬数组转一维

二维转一维

// reduce
const oldArr = [1, 2, [3, 4], [5,6]];
const newArr = oldArr.reduce((pre,cur)=> pre.concat(cur), []);
console.log(newArr)

// concat全部
const oldArr1 = [1, 2, [3, 4]];
const newArr1 = [].concat(...oldArr);

多维度转一维

// 递归插入
const oldArr = [1,2,3,4,5,[5,6,7,[9]]];
function getSimpleArray(oldArr) {
    const arr = [];
    function toArr(oldArr) {
        oldArr.forEach(item => {
            if(Array.isArray(item)) {
                toArr(item)
            } else {
                arr.push(item) 
            }
        });
    }
    toArr(oldArr);
    return arr
}

数字format

千分位符号

function format(num) {
    const arr = ('' + num).split('');
    const list = [];
    let index = 0;
    while(arr.length) {
        index++;
        list.unshift(arr.pop())
        if(index === 3 && arr.length) {
           list.unshift(',')
           index = 0; 
        }
    }
    return list.join('');
}

若有收获,就点个赞吧