数组转链表
数组转链表基本思路
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('');
}
若有收获,就点个赞吧