如何根据 Javascript 中的值对 Map 数组数组进行排序
How to sort Map array of arrays based on values in Javascript
我在 Javascript 中以地图形式收到信息。
我想根据我设置为枚举的类型对其进行排序。
数据如下所示:
地图(5)
{"Adopted" => 105, "Pending" => 176, "Missing" => 3, "InterestedParties" => 45, "WaitingForPickup" => 15}
虽然这样看可能更有意义:
new Map<string, number>([
['Adopted', 105],
['Pending', 176],
['Missing', 3],
['InterestedParties', 45],
['WaitingForPickup', 15],
]);
我想将这些数据分类为“未收养的动物”、“家庭动物”、“未知状态”等类别,所以我制作了一组映射到枚举类型的数据(所以 AnimalStatusType.Pending
是“待处理")
const metricGroups = {
unAdopted: [
AnimalStatusType.Pending,
AnimalStatusType.InterestedParties,
],
adopted: [
AnimalStatusType.Adopted,
],
unknown: [
AnimalStatusType.Missing,
AnimalStatusType.WaitingForPickup
],
}
我希望我的地图按已采用、未采用和未知的三个不同类别排序,看起来像这样:
{
adopted: [['adopted', 105]],
unadopted: [['pending', 176],['interestedParties', 45]],
unknown: [ ['missing', 3],['waitingForPickup', 15]],
}
但是我很难找到任何可以正确映射的东西。我认为也许结合 Array.from
或减少功能可以工作,但搜索主要是拉起 Javascript 的 .map 功能,这无济于事。
const GroupedData = Array.from(animalData).reduce((acc, metric) => {
acc[metricGroups[metric]].push(metric)
})
您可以简单地减少 metricGroups
对象并将枚举值映射到 input
.
中适当的键值对
请注意,您不能对对象的键进行排序。
const AnimalStatusType = {
Adopted: 'adopted',
InterestedParties: 'interestedParties',
Missing: 'missing',
Pending: 'pending',
WaitingForPickup: 'waitingForPickup'
};
const metricGroups = {
unAdopted: [
AnimalStatusType.Pending,
AnimalStatusType.InterestedParties,
],
adopted: [
AnimalStatusType.Adopted,
],
unknown: [
AnimalStatusType.Missing,
AnimalStatusType.WaitingForPickup
],
};
const input = { 'Adopted': 105, 'Pending': 176, 'Missing': 3, 'InterestedParties': 45, 'WaitingForPickup': 15 };
const capitalize = (str) => str.charAt(0).toUpperCase() + str.slice(1);
const result = Object.entries(metricGroups)
.reduce((acc, [key, value]) => ({
...acc,
[key]: value.map(v => [v, input[capitalize(v)]])
}), {});
console.log(result);
.as-console-wrapper { top: 0; max-height: 100% !important; }
您可以使用 map
和 Object.entries
/Object.fromEntries
const input = new Map([
['Adopted', 105],
['Pending', 176],
['Missing', 3],
['InterestedParties', 45],
['WaitingForPickup', 15],
]);
const metricGroups = {
unAdopted: [
"Pending",
"InterestedParties",
],
adopted: [
"Adopted",
],
unknown: [
"Missing",
"WaitingForPickup"
],
}
const result = Object.fromEntries(Object.entries(metricGroups).map(([key, values]) => {
return [
key,
values.map(value => ([value, input.get(value)]))
]
}));
console.log(result);
我在 Javascript 中以地图形式收到信息。
我想根据我设置为枚举的类型对其进行排序。
数据如下所示:
地图(5)
{"Adopted" => 105, "Pending" => 176, "Missing" => 3, "InterestedParties" => 45, "WaitingForPickup" => 15}
虽然这样看可能更有意义:
new Map<string, number>([
['Adopted', 105],
['Pending', 176],
['Missing', 3],
['InterestedParties', 45],
['WaitingForPickup', 15],
]);
我想将这些数据分类为“未收养的动物”、“家庭动物”、“未知状态”等类别,所以我制作了一组映射到枚举类型的数据(所以 AnimalStatusType.Pending
是“待处理")
const metricGroups = {
unAdopted: [
AnimalStatusType.Pending,
AnimalStatusType.InterestedParties,
],
adopted: [
AnimalStatusType.Adopted,
],
unknown: [
AnimalStatusType.Missing,
AnimalStatusType.WaitingForPickup
],
}
我希望我的地图按已采用、未采用和未知的三个不同类别排序,看起来像这样:
{
adopted: [['adopted', 105]],
unadopted: [['pending', 176],['interestedParties', 45]],
unknown: [ ['missing', 3],['waitingForPickup', 15]],
}
但是我很难找到任何可以正确映射的东西。我认为也许结合 Array.from
或减少功能可以工作,但搜索主要是拉起 Javascript 的 .map 功能,这无济于事。
const GroupedData = Array.from(animalData).reduce((acc, metric) => {
acc[metricGroups[metric]].push(metric)
})
您可以简单地减少 metricGroups
对象并将枚举值映射到 input
.
请注意,您不能对对象的键进行排序。
const AnimalStatusType = {
Adopted: 'adopted',
InterestedParties: 'interestedParties',
Missing: 'missing',
Pending: 'pending',
WaitingForPickup: 'waitingForPickup'
};
const metricGroups = {
unAdopted: [
AnimalStatusType.Pending,
AnimalStatusType.InterestedParties,
],
adopted: [
AnimalStatusType.Adopted,
],
unknown: [
AnimalStatusType.Missing,
AnimalStatusType.WaitingForPickup
],
};
const input = { 'Adopted': 105, 'Pending': 176, 'Missing': 3, 'InterestedParties': 45, 'WaitingForPickup': 15 };
const capitalize = (str) => str.charAt(0).toUpperCase() + str.slice(1);
const result = Object.entries(metricGroups)
.reduce((acc, [key, value]) => ({
...acc,
[key]: value.map(v => [v, input[capitalize(v)]])
}), {});
console.log(result);
.as-console-wrapper { top: 0; max-height: 100% !important; }
您可以使用 map
和 Object.entries
/Object.fromEntries
const input = new Map([
['Adopted', 105],
['Pending', 176],
['Missing', 3],
['InterestedParties', 45],
['WaitingForPickup', 15],
]);
const metricGroups = {
unAdopted: [
"Pending",
"InterestedParties",
],
adopted: [
"Adopted",
],
unknown: [
"Missing",
"WaitingForPickup"
],
}
const result = Object.fromEntries(Object.entries(metricGroups).map(([key, values]) => {
return [
key,
values.map(value => ([value, input.get(value)]))
]
}));
console.log(result);