更改_.groupBy()结果数据的顺序

时间:2019-05-10 13:35:16

标签: javascript jquery arrays lodash

每个人,这是我的数组结构

let data = [
    {"name": "ragupathi", "siteID": 10},
    {"name": "abi","siteID": 13},
    {"name": "mahesh", "siteID": 12},
]

我想要基于siteID的组数据 所以我在用groupBy siteID

  

让样本= _.groupBy(data,'siteID');

当前输出为:

{
  "10": [
    {
      "name": "ragupathi",
      "siteID": 10
    }

  ],
  "12": [
    {
      "name": "mahesh",
      "siteID": 12
    }
  ],
  "13": [
    {
      "name": "abi",
      "siteID": 13
    }
  ]
}

但是我期望输出名称按ASC顺序

{
  "13": [
    {
      "name": "abi",
      "siteID": 13
    }
  ],
  "10": [
    {
      "name": "mahesh",
      "siteID": 12
    }
  ],
  "12": [
   {
      "name": "ragupathi",
      "siteID": 10
    }
   ],
}
  1. 通过SiteID分组
  2. 基于对象名称属性的分组输出

2 个答案:

答案 0 :(得分:0)

ES6中对象的属性顺序为:

  • 为整数索引的键,按数字升序
  • 然后,按其添加到对象的顺序,所有其他字符串键。
  • 最后,所有符号键都按照它们添加到对象的顺序排列。

Reference

输出对象具有整数键。无论将键插入对象的顺序如何,始终将按以下顺序打印:10-> 12-> 13

您可以使用Map作为输出。 Map个对象包含键值对,并记住键的原始插入顺序

使用每个唯一的siteID作为键创建一个对象,并使用单个对象作为值创建一个数组。然后根据每个对象的name sort对象的entries。然后从这些排序的条目中创建一个Map(检查浏览器的控制台中的输出。堆栈片段将Map显示为一个空对象)

let data = [
    {"name": "ragupathi", "siteID": 10},
    {"name": "abi", "siteID": 13},
    {"name": "abi","siteID": 13},
    {"name": "mahesh", "siteID": 12},
    {"name": "abi", "siteID": 13},
    {"name": "abi", "siteID": 13},
    {"name": "ragupathi", "siteID": 10}
]

const uniqueSiteGroups = {};
data.forEach(o => uniqueSiteGroups[o.siteID] = [o])

const sortedEntries = Object.entries(uniqueSiteGroups)
                        .sort((a, b) => a[1][0].name.localeCompare(b[1][0].name))

const map = new Map(sortedEntries)

console.log(map) // check the browser's console

答案 1 :(得分:0)

由于不能保证道具的顺序,您必须使用Map或其他方法来获得所需的排序和输出。

您可以像这样使用Array.sortArray.forEachMap

let data = [{"name": "ragupathi", "siteID": 10},{"name": "abi", "siteID": 13},{"name": "abi","siteID": 13},{"name": "mahesh", "siteID": 12},{"name": "abi", "siteID": 13},{"name": "abi", "siteID": 13},{"name": "ragupathi", "siteID": 10}], 
map = new Map()

data
  .sort((a,b) => b.siteID - a.siteID)
  .forEach(x => map.set(x.siteID, [...(map.get(x.siteID) || []), x] || [x]))

console.log(map) // The map object output in your browser console
console.log(Array.from(map.values())) // The siteIds in array form    

一旦将它们放在map对象中,就可以像siteID一样通过map.get(13)轻松地访问组,您将获得siteID为13的分组项的数组。

您还可以始终通过Map.keys()方法获取将密钥存储在地图中的顺序。