【问题标题】:How to sort Map array of arrays based on values in Javascript如何根据Javascript中的值对数组的Map数组进行排序
【发布时间】:2021-10-24 19:10:54
【问题描述】:

我有信息作为 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 或reduce 功能可以工作,但搜索主要是拉起Javascript 的.map 功能,这无济于事。

 const GroupedData =  Array.from(animalData).reduce((acc, metric) => {
        acc[metricGroups[metric]].push(metric)
      })

【问题讨论】:

    标签: javascript arrays sorting multidimensional-array reduce


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您可以简单地减少您的 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; }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-14
        • 2011-02-17
        • 1970-01-01
        • 1970-01-01
        • 2014-08-05
        • 2018-11-01
        • 2015-04-08
        • 1970-01-01
        相关资源
        最近更新 更多