js-算法数据按照对象的key分类

原始数据结构如下,为一个对象

let o = {
    1: {id: 1},
    1.1: {id: 1.1},
    1.1.1: {id: 1.1.1},
    1.1.2: {id: 1.1.2},
    1.2.: {id: 1.2},
    1.2.1: {id: 1.2.1},
    1.3: {id: 1.3},
    1.3.1: {id: 1.3.1},
    1.3.1.1: {id: 1.3.1.1},
    1.3.1.2: {id: 1.3.1.2},
    2: {id: 2},
    2.1: {id: 2.1},
    2.1.1: {id: 2.1.1},
    2.1.2: {id: 2.1.2},
    2.2.: {id: 2.2},
}

转变成如下格式,根据key的层级包装数组

let a = [
  {id: '1', 
  children: [
    {id: '1.1',
    children: [{id: '1.1.1'},{id: '1.1.2'}]}, 
    {id: '1.2',
    children:[{id: '1.2.1'}]},
    {id: '1.3', 
    children:[
      {id: '1.3.1', 
      children: [
        {id: '1.3.1.1'},
        {id: '1.3.1.2'}]}]}]},
  {id: '2',
  children: [
    {id: '2.1', 
    children: [{id: '2.1.1'}, {id: '2.1.2'}]},
    {id: '2.2'}]}
]

请问应该怎么实现? 谢谢

阅读 2.6k
3 个回答

就是转换成树呗?

  1. 先处理一下截取规则。

clipboard.png
clipboard.png

  1. 数据都已经合理了

clipboard.png

搞定

clipboard.png

o = {
    '1': {id: '1'},
    '1.1': {id: '1.1'},
    '1.1.1': {id: '1.1.1'},
    '1.1.2': {id: '1.1.2'},
    '1.2.': {id: '1.2'},
    '1.2.1': {id: '1.2.1'},
    '1.3': {id: '1.3'},
    '1.3.1': {id: '1.3.1'},
    '1.3.1.1': {id: '1.3.1.1'},
    '1.3.1.2': {id: '1.3.1.2'},
    '2': {id: '2'},
    '2.1': {id: '2.1'},
    '2.1.1': {id: '2.1.1'},
    '2.1.2': {id: '2.1.2'},
    '2.2.': {id: '2.2'},
}
returnValue = []
for(var i in o){
    o[i.replace(/\.$/,'')] = o[i]
    var arr = i.replace(/\.$/,'').replace(/(\.\d*)$/,'#$1').split('#')
    //console.log(arr)
    if(arr[1]){
        if(!o[arr[0]].children) o[arr[0]].children = []
        o[arr[0]].children.push(o[i])
    }else{
        returnValue.push(o[i])
    }
}
console.log(returnValue, JSON.stringify(returnValue))
function toTree ( nodes ) {
  const tree = [];
  const map = {};
  for ( const [ key, value ] of Object.entries( nodes ) ) {
    const val = Object.assign( map[ key ] = value, { ...value } );
    const { groups : { index, parent } = {} } = key.match( /^(?<parent>.+)\.(?<index>\d+)$/u ) || {};
    if ( parent ) {
      const node = map[ parent ] || ( map[ parent ] = {} );
      ( node.children || ( node.children = [] ) ).push( val );
    }
    else {
      tree.push( val );
    }
  }
  return tree;
}

let a = toTree( o );
function transform(obj) {
    var arr = [];
    if (obj && typeof obj === "object") {
        for (var key in obj) {
            var length = key.split(".").length;
            var flag = length > 0;
            var _arr = arr;
            while (flag && length--) {
                flag = false;
                for (var j = 0; j < _arr.length; ++j) {
                    var _obj = _arr[j];
                    if (!key.indexOf(_obj.id)) {
                        if (!_obj.children) _obj.children = [];
                        _arr = _obj.children;
                        flag = true;
                        break;
                    }
                }
            }
            _arr.push({ id: key });
        }
    }
    return arr;
}
console.log(transform(o));
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题