Javascript递归处理数组

surile
2021-04-09 / 0 评论 / 25 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2021年04月09日,已超过242天没有更新,若内容或图片失效,请留言反馈。

前端添加数据,未进入数据库,因此选中的数据,是由name组成,后台将数据返回时,带有id,不能进行删除操作,只能进行修改name操作,因原先是由name组成数据,为了匹配修改的数据,所以要将选中的数据,转化成id

手动定义数据结构

let data = [{
    // 规格名称,可修改
    kindName: "二级规格",
    customValue: "",
    // 已选中
    specificationsName: ["测试","测试2"],
    dialogVisible: false,
    // 默认所有的数据,未选中和已选中的数据都在里面
    defaultSpecificationsName: [
        {
            id:1,
            name: "测试",
            
        },
        {
            id:2,
            name: "测试2",
            child:[
                {
                    kindName:"测试2",
                    customValue:"",
                    specificationsName:["测试3"],
                    dialogVisible:false,
                    defaultSpecificationsName:[
                        {
                            id:3,
                            name:"测试3"
                        }
                    ]
                }
            ]
        }
    ]
}]

递归函数

写成公共递归函数,可根据name获取id,也可以根据id获取name,方便提交数据。

let traversalIds = (setValues,value) => {    
    // setValues 传递的data数组,value是参数,若是需要获取id,则传入的是name,反之。
    setValues.forEach(item => {
        let specificationName = []
        item.specificationsName.forEach(o => {
            item.defaultSpecificationsName.forEach(i => {
                if(i.child && i.child instanceof Array){
                    onTraversalIds(i.child,value)
                }
                if(o === i[value]){
                   // 判断specificationsName中的id或name是否等于
                    specificationName.push(i[value])
                }
                item.specificationsName = specificationName // 修改某数据下的specificationName
            })
        })
    })
    return setValues   // 将以修改的数据返回
}

平级数据

将所有选中的数据,添加至一个数组中,pid是关联父id

let TraversalArray = (setValues,pid) => {
    let specifications = []
    for(let index = 0;index < setValues.length;index++){
       const data = setValues[index]
       data.specificationsName.forEach(name => {
           data.defaultSpecificationsName.forEach(item => {
               // 判断name是否相等
               if(name == item.name){
                   // 若是相等,则添加至数组中
                   specifications.push({
                       id:item.id ? item.id : "",
                       pid:pid,
                       name:item.name
                   })
                   // 循环数组,若是没有pid,将pid删除
                   specifications.map(o => {
                       if(!o.pid){
                          delete o.pid 
                       }
                   })
                  // 终止结束
                  return
               }
              // 判断是否有child
               if(item.child && item.child instanceof Array){
                  // 重新调用此函数,并将父id传递到此函数中
                   const obj = TraversalArray(item.child,item.id)
                  // 判断返回的数据是否是数组
                   if(obj instanceof Array){
                      // 如果是合并两个数组,并将合并的数组返回
                      specifications = [...specifications,...obj]
                      return specifications
                   }
               }
           })
       })
    }
    return specifications
}
0

评论 (0)

取消