javascript - js数据处理转换??
阿神
阿神 2017-04-11 11:18:52
[JavaScript讨论组]
var data1=[{
            "tid": "1",
            "text": "产品分析",
            "children": [{
                "tid": "1-1",
                "text": "模拟产品计划",
                "children": [{
                    "tid": "1-1-1",
                    "text": "用户行为分析1"
                }, {
                    "tid": "1-1-2",
                    "text": "用户行为分析2"
                }]
            }]
 var data2 = [
            {"tid": "1", "text": "产品分析"},
            {"tid": "1-1", "pid": "1", "text": "模拟产品计划"},
            {"tid": "1-1-1", "pid": "1-1", "text": "用户行为分析1"},
            {"tid": "1-1-2", "pid": "1-1", "text": "用户行为分析2"}
        ];

请问大神,这两种数据格式怎么互相转换?注意pid的增添!!!

阿神
阿神

闭关修行中......

全部回复(5)
PHP中文网
var data=[{
    "tid": "1",
    "text": "产品分析",
    "children": [{
        "tid": "1-1",
        "text": "模拟产品计划",
        "children": [{
                    "tid": "1-1-1",
                    "text": "用户行为分析1"
                }, {
                    "tid": "1-1-2",
                    "text": "用户行为分析2"
                }]
        }] 
}];
            
var res = [];

function transform(arr,pid){
    arr.map(function(item){
        res.push({
            tid : item.tid,
            pid : pid,
            text : item.text
        });        
        item.children && item.children.length && transform(item.children , item.tid);
    });
}

transform(data);

console.log(res);

function buildTree(tree,node){
    if(!node.pid){
        delete node.pid;
        tree.push(node);
    }
    else{
        tree.map(function(item){
            if(item.tid == node.pid){
                delete node.pid;
                item.children = item.children || [];                
                item.children.push(node);
            }else{
                buildTree(item.children,node);
            }
        });
        
    }    
}

var data = [];

for(item of res){
    buildTree(data,item);
}

console.log(data)
怪我咯
转树形:
function createTree(data, arr, tid) {
    arr = arr || [];
    data.reduce(function(prev, item) {
        tid ? prev.push({
            tid: item.tid,
            isleaf: item.isleaf,
            pid: tid,
            text: item.text
        }) : prev.push({
            tid: item.tid,
            isleaf: item.isleaf,
            text: item.text
        });
        item.children ? createTree(item.children, arr, item.tid) : '';
        return prev
    }, arr)
    return arr
}


//转回去
function orgData(data, arr) {
    arr = arr || [];
    let hash = {};
    let index = 0;
    data.reduce(function(prev, item) {
        item.pid ? '' : (hash[item.tid] = ++index, prev.push({
            tid: item.tid,
            isleaf: item.isleaf,
            text: item.text
        }));
        if (hash[item.pid]) {
            prev[hash[item.pid] - 1].children ? prev[hash[item.pid] - 1].children.push(item) : prev[hash[item.pid] - 1].children = [item]
        } else {
            if (item.pid) {
                let tt;
                item.tid.split('-').forEach(function(num, i) {
                    tt ? tt['children'] ? tt['children'][num - 1] = tt['children'][num - 1] || item : (tt['children'] = [], tt['children'][num - 1] = item) : '';
                    tt ? tt = tt['children'][num - 1] : tt = prev[num - 1];
                });
            }
        }
        return prev;
    }, arr);
    return arr;
}
PHPz

树形转为非树形很简单.
写一个递归判断如果children 不为空继续调用
每次返回一个对象数组, 把返回的数组contact, 最后输出总的数组集合

ps: 没有pid 建议给一个默认值

大家讲道理

递归,传入child和pid就好了。。。

function flatten(data, pid){
  if(!data) return [];

  var { tid, text, children } = data;
  var result = [{ tid, text, pid }];

  if(children) {
    children.forEach(child=>{
      result = result.concat(flatten(child, tid));
    });
  }

  return result;
}

console.log(flatten(data1[0]));
怪我咯
function trans (parent, data) {
    var res = {
        tid: data.tid,
        text: data.text
    };
  
    parent && (res.pid = parent.tid);

    return !data.children ? [res] : [res].concat(walk(res, data.children));
}

function walk (parent, children) {
    return children.reduce(function (prev, next) {
        return prev.concat(trans(parent, next));
    }, []);
}


walk(null, data1);
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号