如何根据 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; }

您可以使用 mapObject.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);