一个简单的js数组归类问题

输入是
[{a:1,b:'ssss',c:'',d:''},{a:1,b:'ssswwdasgw',c:'',d:''},{a:2,b:'sssdfyhwww',c:'',d:''},{a:3,b:'ssswjkww',c:'',d:''}]
需要转化成:
[[{a:1,b:'ssss',c:'',d:''},{a:1,b:'ssswwdasgw',c:'',d:''}],[{a:2,b:'sssdfyhwww',c:'',d:''}],[{a:3,b:'ssswjkww',c:'',d:''}]]

就是根据 a 的值来对数组进一步分组。
目前想到的就是先弄个数组存a的数值,去重复,再根据这个数组去筛选,想知道有什么好一点的方法

阅读 2.3k
2 个回答
let result = arr.reduce((p, c) => [
    p[c['a']] = p[c['a']] || [],
    p[c['a']].push(c),
    p
][2], {})

声明一个对象obj,用来建立a值 -> list的隐射,list即最终结果中的一项。
声明一个数组result,用来存放所有的list
对于源数组每一项item,判断a值是否在obj中,在则取出对应list,list.push(item)
不在,则添加一组a值->[item]对应关系,并且将这个新数组push到result里。

一次遍历完事,时间复杂度O(n).

function handleData(attr) {
  let m = {}
  return attr.reduce((r, i) => (!m[i.a] && r.push(m[i.a] = []), m[i.a].push(i), r), [])
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题