【问题标题】:How to sort an array using Array.prototype.sort() by two properties? [duplicate]如何使用 Array.prototype.sort() 按两个属性对数组进行排序? [复制]
【发布时间】:2021-12-20 20:59:36
【问题描述】:

如何使用Array.prototype.sort()typecurrency 对数组进行排序:

借方 => 贷方 => 外部 => 贷款

如果同一类型有几种货币,则按以下顺序排列:

卢布 => 美元 => 欧元 => 英镑

我了解如何对数字使用 sort(),但我不了解如何进行这种排序。

const accounts = [
  { id: 1, type: 'credit', currency: 'GBP' },
  { id: 2, type: 'debit', currency: 'EUR' },
  { id: 3, type: 'loan' },
  { id: 4, type: 'credit', currency: 'RUB' },
  { id: 5, type: 'credit', currency: 'RUB' },
  { id: 6, type: 'debit', currency: 'USD' },
  { id: 7, type: 'debit', currency: 'RUB' },
  { id: 8, type: 'external' },
  { id: 9, type: 'credit', currency: 'EUR' }
];

accounts.sort((a, b) => {
  
});

【问题讨论】:

    标签: javascript


    【解决方案1】:

    您可以将typecurrency 属性的顺序存储在一个数组中,然后减去索引以确定优先级:

    const typeOrder = ['debit', 'credit', 'external', 'loan']
    const currencyOrder = ['RUB', 'USD', 'EUR', 'GBT']
    
    const accounts=[{id:1,type:"credit",currency:"GBP"},{id:2,type:"debit",currency:"EUR"},{id:3,type:"loan"},{id:4,type:"credit",currency:"RUB"},{id:5,type:"credit",currency:"RUB"},{id:6,type:"debit",currency:"USD"},{id:7,type:"debit",currency:"RUB"},{id:8,type:"external"},{id:9,type:"credit",currency:"EUR"}];accounts.sort((e,c)=>{});
    
    const res = accounts.sort((a,b) => {
      return typeOrder.indexOf(a.type) - typeOrder.indexOf(b.type) || currencyOrder.indexOf(a.currency) - currencyOrder.indexOf(b.currency)
    })
    
    console.log(res)

    【讨论】:

      【解决方案2】:

      您可以将对象用于订单并使用逻辑 OR 链接增量。

      const
          types = { debit: 1, credit: 2, external: 3, loan: 4 },
          currencies = { RUB: 1, USD: 2, EUR: 3, GBT: 4 },
          accounts = [{ id: 1, type: 'credit', currency: 'GBP' }, { id: 2, type: 'debit', currency: 'EUR' }, { id: 3, type: 'loan' }, { id: 4, type: 'credit', currency: 'RUB' }, { id: 5, type: 'credit', currency: 'RUB' }, { id: 6, type: 'debit', currency: 'USD' }, { id: 7, type: 'debit', currency: 'RUB' }, { id: 8, type: 'external' }, { id: 9,
      type: 'credit', currency: 'EUR' }];
      
      accounts.sort((a, b) => 
          types[a.type] - types[b.type] ||
          currencies[a.currency] - currencies[b.currency]
      );
      
      console.log(accounts);
      .as-console-wrapper { max-height: 100% !important; top: 0; }

      【讨论】:

        【解决方案3】:

        这是最简单的

        当 order1 为 0(a 和 b 相同)时,我们使用 order2

        const order1 = ["debit","credit","external","loan"],
        order2 = ["RUB","USD","EUR","GBT"]
        
        const accounts = [ { id: 1, type: 'credit', currency: 'GBP', }, { id: 2, type: 'debit', currency: 'EUR', }, { id: 3, type: 'loan', }, { id: 4, type: 'credit', currency: 'RUB', }, { id: 5, type: 'credit', currency: 'RUB', }, { id: 6, type: 'debit', currency: 'USD', }, { id: 7, type: 'debit', currency: 'RUB', }, { id: 8, type: 'external', }, { id: 9, type: 'credit', currency: 'EUR', }, ]; 
        
        accounts.sort((a, b) => { 
          return order1.indexOf(a.type) - order1.indexOf(b.type) || 
          order2.indexOf(a.currency) - order2.indexOf(b.currency)
        });
        console.log(accounts)

        【讨论】:

          【解决方案4】:

          你可以创建两个map来存储每个类别的“优先级”,排序结果是类型优先级之间的差异,如果为0,则为货币的差异:

          const accounts = [ { id: 1, type: 'credit', currency: 'GBP' }, { id: 2, type: 'debit', currency: 'EUR' }, { id: 3, type: 'loan' }, { id: 4, type: 'credit', currency: 'RUB' }, { id: 5, type: 'credit', currency: 'RUB' }, { id: 6, type: 'debit', currency: 'USD' }, { id: 7, type: 'debit', currency: 'RUB' }, { id: 8, type: 'external' }, { id: 9, type: 'credit', currency: 'EUR' } ];
          
          const 
           TYPE_PRIORITY = { 'debit': 1, 'credit': 2, 'external': 3, 'loan': 4 },
           CURRENCY_PRIORITY = { 'RUB': 1, 'USD': 2, 'EUR': 3, 'GBP': 4 };
          accounts.sort((a, b) => 
            TYPE_PRIORITY[a.type] - TYPE_PRIORITY[b.type] || 
            CURRENCY_PRIORITY[a.currency] - CURRENCY_PRIORITY[b.currency]
          );
          
          console.log(accounts);

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-09-20
            • 1970-01-01
            • 2019-01-12
            • 1970-01-01
            • 2012-01-25
            • 2012-08-05
            • 2023-03-13
            相关资源
            最近更新 更多