每个人,这是我的数组结构
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
}
],
}
答案 0 :(得分:0)
ES6中对象的属性顺序为:
输出对象具有整数键。无论将键插入对象的顺序如何,始终将按以下顺序打印: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.sort,Array.forEach和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}],
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()方法获取将密钥存储在地图中的顺序。