遍历json对象改变结构?

新手上路,请多包涵
let indexData = [
  {
    index: "A",
    name: "阿依莫"
  },
  {
    index: "A",
    name: "阿凡达"
  },
  {
    index: "C",
    name: "曹操"
  },
  {
    index: "C",
    name: "曹海军"
  },
  {
    index: "C",
    name: "陈晨"
  },
  {
    name: "没有index"
  },
  {
    index: "啊",
    name: "index不是字母"
  }
]

数据量有点大,请问该如何遍历得到如下格式又节省性能:

[
  {
    index: "A",
    datas: [
      {
        index: "A",
        name: "阿依莫"
      },
      {
        index: "A",
        name: "阿凡达"
      }
    ]
  },
  {
    index: "C",
    datas: [
      {
        index: "C",
        name: "曹操"
      },
      {
        index: "C",
        name: "曹海军"
      },
      {
        index: "C",
        name: "陈晨"
      }
    ]
  },
  {
    index: "#",
    datas: [
      {
        name: "没有index"
      },
      {
        index: "啊",
        name: "index不是字母"
      }
    ]
  }
]
阅读 2k
5 个回答
let indexData = [
  {
    index: "A",
    name: "阿依莫"
  },
  {
    index: "A",
    name: "阿凡达"
  },
  {
    index: "C",
    name: "曹操"
  },
  {
    index: "C",
    name: "曹海军"
  },
  {
    index: "C",
    name: "陈晨"
  },
  {
    name: "没有index"
  },
  {
    index: "啊",
    name: "index不是字母"
  }
]

function isLetters( str ){
    var re=/^[A-Za-z]+$/;
    if (str.match(re) == null)
        return false;
    else
        return true;
}

const groupByCategory = indexData.reduce((group, product) => {
  let { index } = product;
  if(!index || !isLetters(index)){
    index='#'
  }
    
  group[index] = group[index] ?? [];
  group[index].push(product);
  return group;
}, {});
console.log(groupByCategory);

1676430463280.png

就是简单的分组,不知道 Lodash.groupBy 能满足你的需求不。如果自己写就是维护一个二维数组,可以通过 object 或者 Map 来优化第一维,对 index 建立索引。

let obj = {}
let list = indexData.reduce((s, v) => {
    let index = ''
    if (v.index && v.index.match(/^[A-Za-z]+$/)) {
        index = v.index
    } else {
        index = '#'
    }
    let i = obj[index]
    if (i !== undefined) {
        s[i].data.push(v)
    } else {
        s.push({index, data: [v]})
        obj[index] = Object.keys(obj).length
    }
    return s
}, [])
console.log(list)

js 代码

Object.values(indexData.reduce((o, i) => {
    let index = i.index?.match(/^[a-zA-Z]+$/) ? i.index : '#';
    (o[index] ??= {index, datas: []}).datas.push(i);
    return o;
}, {}))

结果

[
  {
    "index": "A",
    "datas": [
      {
        "index": "A",
        "name": "阿依莫"
      },
      {
        "index": "A",
        "name": "阿凡达"
      }
    ]
  },
  {
    "index": "C",
    "datas": [
      {
        "index": "C",
        "name": "曹操"
      },
      {
        "index": "C",
        "name": "曹海军"
      },
      {
        "index": "C",
        "name": "陈晨"
      }
    ]
  },
  {
    "index": "#",
    "datas": [
      {
        "name": "没有index"
      },
      {
        "index": "啊",
        "name": "index不是字母"
      }
    ]
  }
]

// 数组对象 分类

let obj = [
    {name: 'Alice', job: 'Data Analyst', country: 'AU'},
    {name: 'Bob', job: 'Pilot', country: 'US'},
    {name: 'Lewis', job: 'Pilot', country: 'US'},
    {name: 'Karen', job: 'Software Eng', country: 'CA'},
    {name: 'Jona', job: 'Painter', country: 'CA'},
    {name: 'Jeremy', job: 'Artist', country: 'SP'},
]
let ppl = obj.reduce((group, curP) => {
    
    let newkey = curP['country']
        if(!group[newkey]){
            group[newkey]=[]
        }
    group[newkey].push(curP)
        return group
}, [])  
console.log(ppl);
/* 
    [AU: Array(1), US: Array(2), CA: Array(2), SP: Array(1)]
    AU: Array(1)
        0: {name: 'Alice', job: 'Data Analyst', country: 'AU'}
    CA: Array(2)
        0: {name: 'Karen', job: 'Software Eng', country: 'CA'}
        1: {name: 'Jona', job: 'Painter', country: 'CA'}
    SP: Array(1)
        0: {name: 'Jeremy', job: 'Artist', country: 'SP'}
    US: Array(2)
        0: {name: 'Bob', job: 'Pilot', country: 'US'}
        1: {name: 'Lewis', job: 'Pilot', country: 'US'}
*/

————————————————————————————————
/* _数组转树

[ 
    { id: "01", name: "张大大", pid: "", job: "项目经理" },
    { id: "02", name: "小亮", pid: "01", job: "产品leader" },
    { id: "03", name: "小丽", pid: "02", job: "产品经理" },
    { id: "04", name: "大光", pid: "02", job: "产品经理" },
    ]
    // ----------------- 转换为 -----------------------------
    [
        { label: '项目经理-张大大', children: [
            { label: '产品leader-小亮', children: [
                { label: '产品经理-小丽'},
                { label: '产品经理-大光'}
            ]}
        ]}
    ]
// 思路  
       1 JSON.parse(JSON.stringify) 实现数组深拷贝 
       2 数组foreEach 和 push 
       3 || 短路判断 
       4 引用数据类型*/
// 解题 

var data = [

    { id: "01", name: "张大大", pid: "", job: "项目经理" },
    { id: "02", name: "小亮", pid: "01", job: "产品leader" },
    { id: "03", name: "小丽", pid: "02", job: "产品经理" },
    { id: "04", name: "大光", pid: "02", job: "产品经理" },
    ]
function arrTree(data){
    console.log(data,"___res");
    let nData = JSON.parse(JSON.stringify(data))  // 数组深拷贝 避免影响数据源 
    console.log(nData,'-------');
    let result = []                               // 存放 以 抛出  
    let map = {}

    nData.forEach(item => {                       // 循环 把每一项的引用 放到map对象里面 
        // console.log(item)_nData_i 
        map[item.id] = item    
        // delete item.id // id 已经保存在了map.key里 可以删掉
    });
    // console.log(map) _map 已存值  
    nData.forEach((item)=>{                       // 再次循环 确定值的 流向  
        let parent = map[item.pid];
        // 下面是数据处理 
        item.lable = item.job + '-' + item.name
        // delete item.pid
        // delete item.name
        // delete item.job
        console.log(item.lable,'0')
        if (parent) {
        // 如果 map[item.pid] 有值 则 parent 为 item 的父级
        // 判断 parent 里有无children 如果没有则创建 如果有则直接把 item push到children里
        (parent.children || (parent.children = [])).push(item);
        } else {
        // 如果 map[item.pid] 找不到值 说明此 item 为 第一级
        result.push(item);
        }
    })
    return result
}
arrTree(data)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题