数组转换成树
// 完成版
function getTreeData(oriCode, oriData) {
let result = []
for (let obj of oriData) {
if (obj.facode === oriCode) {
obj.children = getTreeData(obj.code, oriData)
result.push(obj)
}
}
return result
}
// 初步1——数组转换成树
function generateOptions(params){
var result=[]
for(let param of params){
if(param.facode==0){
var parent = {
code:param.code,
facode:param.facode,
}
parent.children = getchilds(param.code,params);
result.push(parent)
}
}
return result
};
function getchilds(code,array){
let childs = new Array()
for(let arr of array){
if(arr.facode == code){
childs.push({
code:arr.code,
facode:arr.facode
})
}
}
for (let child of childs){
let childscopy = getchilds(child.code,array);
if(childscopy.length>0){
child.children = childscopy
}
}
return childs
}
// 初步2——数组转换成树
function getTree(params){
var result=[]
var parent = {code:"0",facode:""}
parent.children = getchilds(parent.code,params);
result.push(parent)
return result
};
function getchilds(array,code){
let childs = new Array()
for(let arr of array){
if(arr.facode == code){
childs.push({ ...arr })
}
}
for (let child of childs){
let childscopy = getchilds(array,child.code);
if(childscopy.length>0){
child.children = childscopy
}
}
return childs
};
// 初步3——数组转换成树
function getTree(data){
var result = [];
var codeList = [];
data.forEach(item => {
codeList.push(item.code)
});
for(let arr of data){
if(arr.facode==""){
var parent = {...arr}
parent.children = getchilds(data,arr.code)
result.push(parent)
}else{
const a = codeList.indexOf(arr.facode)
if(a==-1){
var parent = {...arr}
parent.children = getchilds(data,arr.code)
result.push(parent)
}
}
}
return result
}
function getchilds(array,code){
let childs = new Array()
for(let arr of array){
if(arr.facode == code){
childs.push({ ...arr })
}
}
for (let child of childs){
let childscopy = getchilds(array,child.code);
if(childscopy.length>0){
child.children = childscopy
}
}
return childs
};
// 初步4——数组转换成树
function getTree(data){
var result = [];
var codeList = [];
data.forEach(item => {
codeList.push(item.code)
});
for(let arr of data){
const index = codeList.indexOf(arr.facode)
const child =[]
data.forEach(item=>{
if(item.facode==arr.code){ child.push(item) }
})
if(index==-1){
var parent = {...arr}
parent.children = child
result.push(parent)
}else{
arr.children = child
}
}
return result
}
// 初步5——数组转换成树
function getTree(data,code){
var result = [];
for(let arr of data){
const child =[]
data.forEach(item=>{
if(item.facode==arr.code){ child.push(item) }
})
if(arr.facode == code){
var parent = {...arr}
parent.children = child
result.push(parent)
}else{
arr.children = child
}
}
return result
}
树转换成数组
let result = []
function getOri(params){
for(const data of params){
result.push({
code:data.code,
facode:data.facode,
})
data.children && getOri(data.children)
}
return result
}
const ori=getOri(treeData)
遍历树
深度优先遍历
先序遍历
function DFS(params,func){
params.forEach(data=>{
func(data)
data.children&&DFS(data.children,func)
})
}
function DFS(params,func){
for(const data of params){
func(data)
data.children && DFS(data.children,func)
}
}
后序遍历
function DFS(params,func){
params.forEach(data=>{
data.children && DFS(data.children,func)
func(data)
})
}
DFS(treeData,node=>{
console.log(node)
})
// 初步1——深度优先遍历
function DFS(params){
for(let i in params){
if(params[i].children){
DFS(params[i].children)
}
}
}
广度优先遍历
function BFS(params,func){
let node,list = [...params]
while (node = list.shift()){
func(node)
node.children && list.push(...node.children)
}
}
BFS(treeData,node=>{
console.log(node)
})
树的查找
// 完成版
function treeFind (params, func) {
var res
for (const data of params) {
if (func(data)) {
res = data
break;
}
if(data.children){
const resCopy = treeFind(data.children,func)
if(resCopy){
res = resCopy
break;
}
}
}
return res
}
// 初步1——树的查找
function treeFind (tree, func) {
for (const data of tree) {
if (func(data)) return data
if (data.children) {
const res = treeFind(data.children, func)
if (res) return res
}
}
return null
}
const data=treeFind(treeData,node=>node.facode=="0")
console.log(data)
树的过滤
// 完成版
function treeFilter(params,func){
const arr = []
for (let data of params){
if(func(data)){
arr.push(data)
if(data.children){
data.children=treeFilter(data.children,func)
if(data.children.length==0){
delete data.children
}
}
}
}
return arr
}
const dataFilter=treeFilter(treeData,node=>node.code.includes('4'))
// 树的过滤(方法一:不推荐)
function treeFilter(params,func){
const arr = []
for (const data of params) {
if(func(data)){
var parent = {
code:data.code,
facode:data.facode,
}
if(data.children){
if(data.children.length!==0){
parent.children = treeFilter(data.children,func);
}
}
arr.push(parent)
}
}
return arr
}
const dataFilter=treeFilter(treeData,node=>node.code.includes('4'))
树的添加
function add(params){
if(params.facode=="0"){
treeData.push(params)
}else{
//否则寻找父级节点
treeFind(treeData,node=>node.code==params.facode).children.push(params)
}
}
add(cs)
// 树的添加(另一种树):
function add(params){
treeFind(treeData,node=>node.code==params.facode).children.push(params)
}
树的修改
// 完成版
function editData(params){
treeFind(treeData,node=>node.code==params.code).facode = params.facode
//重新生成树
//树转数组
let result = []
function getOri(params){
for(const data of params){
result.push({ ...data })
data.children && getOri(data.children)
}
return result
}
const ori=getOri(treeData)
const treeData1 = getTree(ori,"0")
return treeData1
}
const dataEdit = editData(cs2)
// 初步1——树的修改(内容修改)
function editData(params){
if(params.facode=="0"){
let index = treeData.indexOf(params.code)
treeData.splice(index,1)
}else{
let del = treeFind(treeData,node=>node.code==params.facode).children
// let index = del.map(x=>x.code).indexOf(params.code)
let index = del.findIndex(x=>x.code===params.code)
del.splice(index,1,params)
}
}
editData(cs3)
// 初步2——树的修改(包括父级修改)
function editFa(params){
if(params.facode=="0"){
let index = treeData.findIndex(x=>x.code===params.code)
if(index == -1){
//推进并删除原先位置
let del = treeFind(treeData,node=>node.code==params.code)
let delFa = treeFind(treeData,node=>node.code==del.facode).children
let index = delFa.findIndex(x=>x.code===params.code)
delFa.splice(index,1)
treeData.push(params)
}else{
//替代
treeData.splice(index,1,params)
}
}else{
let del = treeFind(treeData,node=>node.code==params.facode).children
let index = del.findIndex(x=>x.code===params.code)
if(index== -1){
//删除原先并推进
let del1 = treeFind(treeData,node=>node.code==params.code)
if(del1.facode=="0"){
let index = treeData.findIndex(x=>x.code===params.code)
treeData.splice(index,1)
}else{
let delFa = treeFind(treeData,node=>node.code==del1.facode).children
let index = delFa.findIndex(x=>x.code===params.code)
delFa.splice(index,1)
}
del.push(params)
}else{
del.children.splice(index,1,params)
}
}
}
editFa(cs4)
// 初步3——树的修改(修改父级)
function editData(params){
const editdata = treeFind(treeData,node=>node.code==params.code)
editdata.facode = params.facode
//重新生成树
//树转数组
let result = []
function getOri(params){
for(const data of params){
result.push({
code:data.code,
facode:data.facode,
})
data.children && getOri(data.children)
}
return result
}
const ori=getOri(treeData)
const treeData1 = getTree(ori)
return treeData1
}
const dataEdit = editData(cs4)
树的删除
// 完成版
function deleteData(params,code){
if(params.facode==code){
let index = treeData.findIndex(x=>x.code===params.code)
treeData.splice(index,1)
}else{
let del = treeFind(treeData,node=>node.code==params.facode).children
let index = del.findIndex(x=>x.code===params.code)
del.splice(index,1)
}
}
// 初步1——树的删除
function deleteData(params){
let del = treeFind(treeData,node=>node.code==params.facode).children
let index = del.findIndex(x=>x.code===params.code)
del.splice(index,1)
}
deleteData(cs)
致我实习那段灰暗的日子