字母数字分组问题

问题描述 投票:0回答:1

我有一个这样形状的

Object

[
  {
    "firstLetter": "1",
    "cartItem": [
      {
        "label": "1 ABCD",   
        "country": "USA"
    ],
  },
  {
    "firstLetter": "3",
    "cartItem": [
      {
        "label": "3 ASRFT",   
        "country": "USA"
    ],
  },
  {
    "firstLetter": "4",
    "cartItem": [
      {
        "label": "4 HELLO",   
        "country": "USA"
    ],
  },
  {
    "firstLetter": "B",
    "cartItem": [
      {
        "label": "BOB",   
        "country": "USA"
    ],
  },
  {
    "firstLetter": "B",
    "cartItem": [
      {
        "label": "BILLY",   
        "country": "USA"
    ],
  },
  {
    "firstLetter": "G",
    "cartItem": [
      {
        "label": "GARY",   
        "country": "USA"
    ],
  },
  {
    "firstLetter": "G",
    "cartItem": [
      {
        "label": "GRAHAM",   
        "country": "USA"
    ],
  },
  {
    "firstLetter": "Y",
    "cartItem": [
      {
        "label": "YELLOW",   
        "country": "USA"
    ],
  }
  

现在我正在将其分组、过滤和排序:

  • 1
    • 1ABCD
  • 3
    • 3 ASRFT
  • 4
    • 4 你好
  • B
    • 鲍勃
    • 比利
  • G
    • 加里
    • 格雷厄姆
    • 黄色

我现在尝试对它进行分组的方式与数字略有不同。我希望所有数字都位于同一组下,如下所示:

  • !!!
    • 1ABCD
    • 3 ASRFT
    • 4 你好
  • B
    • 鲍勃
    • 比利
  • G
    • 加里
    • 格雷厄姆
    • 黄色

这是我能够完成第一个列表的代码,但我希望以某种方式添加一些逻辑,将所有数字分组到同一组下

!!!!

function groupBy<firstIndex, item>(
  array: item[],
  grouper: (item: item) => firstIndex
) {
  return array.reduce((store, item) => {
    var key = grouper(item);
    if (!store.has(key)) {
      store.set(key, [item]);
    } else {
      store?.get(key)?.push(item);
    }
    return store;
  }, new Map<firstIndex, item[]>());
}

let groupedArr = groupBy(options, x => x.label?.[0])
javascript typescript sorting filtering
1个回答
0
投票

检查

key
是否为数字,如果是数字,则将其替换为
!!!

function groupBy<firstIndex, item>(
  array: item[],
  grouper: (item: item) => firstIndex
) {
  return array.reduce((store, item) => {
    var key = grouper(item);
    if (/^\d+$/.test(key)) key = '!!!';
    if (!store.has(key)) {
      store.set(key, [item]);
    } else {
      store?.get(key)?.push(item);
    }
    return store;
  }, new Map<firstIndex, item[]>());
}

let groupedArr = groupBy(options, x => x.label?.[0])
© www.soinside.com 2019 - 2024. All rights reserved.