javascript 数组处理,相同的放一起

假设有一个数组是这样

[
    {eid: cat, name: aa},
    {eid: cat, name: bb},
    {eid: dog, name: cc},
    {eid: cat, name: dd},
    {eid: pig, name: ee},
    {eid: cat, name: ff},
    {eid: dog, name: gg}
]

我想要对数组做处理,将相同的eid放在一起

变成

[
    {eid: cat, name: aa},
    {eid: cat, name: bb},
    {eid: cat, name: dd},
    {eid: cat, name: ff},
    {eid: dog, name: cc},
    {eid: dog, name: gg},
    {eid: pig, name: ee}
]


这有办法实现吗?

阅读 9.3k
3 个回答
var data = [
  {eid: 'cat', name: 'aa'},
  {eid: 'cat', name: 'bb'},
  {eid: 'dog', name: 'cc'},
  {eid: 'cat', name: 'dd'},
  {eid: 'pig', name: 'ee'},
  {eid: 'cat', name: 'ff'},
  {eid: 'dog', name: 'gg'}
]

function trans (data) {
  let cache = {} // cache存储的键是eid,值是这个eid在indices数组中的下标
  let indices = [] // 数组中的每一个值是一个数组,数组中的每一个元素是原数组中相同eid的下标
  data.forEach((item, i) => {
    let eid = item.eid
    let index = cache[eid]
    if (index !== undefined) {
      indices[index].push(i)
    } else {
      cache[eid] = indices.length
      indices.push([i])
    }
  })
  /**
   * 此时,cache:{cat: 0, dog: 1, pig: 2}
   * indices: [[0, 1, 3, 5], [2, 6], [4]]
   * indices中的第1项是eid为cat的数组下标
   * indices中的第2项是eid为dog的数组下标
   * indices中的第3项是eid为pig的数组下标
   */
  let result = []
  indices.forEach(item => {
    item.forEach(index => {
      result.push(data[index]) // 依次把index对应的元素data[index]添加进去即可
    })
  })
  
  return result
}

let result = trans(data)
console.log(result)

你的问题里面有个不明确的地方,比如下面这个例子:

var data = [
  {eid: 'dog', name: 'aa'},
  {eid: 'cat', name: 'bb'},
  {eid: 'dog', name: 'cc'}
]

你是想输出1:

[
  {eid: 'dog', name: 'aa'},
  {eid: 'dog', name: 'cc'},
  {eid: 'cat', name: 'bb'}
]

还是想输出2:

[
  {eid: 'cat', name: 'bb'},
  {eid: 'dog', name: 'aa'},
  {eid: 'dog', name: 'cc'}
]

输出1是按照出现的先后顺序排列的,输出2是按照字母序排列的,我给的是输出1的函数,如果想要输出2的结果,可以参考楼上。

[
    {eid: 'cat', name: 'aa'},
    {eid: 'cat', name: 'bb'},
    {eid: 'dog', name: 'cc'},
    {eid: 'cat', name: 'dd'},
    {eid: 'pig', name: 'ee'},
    {eid: 'cat', name: 'ff'},
    {eid: 'dog', name: 'gg'}
].sort((a, b) => {
  return a.eid === b.eid ? 1 : -1
}).reverse()

结果见图:

clipboard.png

用sort思路是对的~
不过@zollero 的比较方法用的===有问题,只是结果正好正确,把第二项改成和第一项不一样结果就错了。

稍微调整一下:

[
    {eid: 'cat', name: 'aa'},
    {eid: 'cat', name: 'bb'},
    {eid: 'dog', name: 'cc'},
    {eid: 'cat', name: 'dd'},
    {eid: 'pig', name: 'ee'},
    {eid: 'cat', name: 'ff'},
    {eid: 'dog', name: 'gg'}
].sort((a, b) => {
  return a.eid > b.eid ? 1 : -1
})
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题