【问题标题】:In JavaScript how do I sort an array of arrays by asc / desc在 JavaScript 中,如何按 asc / desc 对数组进行排序
【发布时间】:2019-10-06 21:13:29
【问题描述】:

技术: Angular 7、AngularCli、JS 和 TS。

在Js中如何按asc和desc顺序对数组进行排序

这是我的示例数组:

this.tableRows = [
  [ 'zz', 'cc' ],
  [ 'aa', 'cc' ],
  [ 'uu', 'dd' ]
];

我想按列位置和 asc / desc 对上面的内容进行排序。

这是我的 HTML:

<tr ls-table-row class="child-row" *ngFor="let row of tableRows">
  <td ls-table-cell *ngFor="let cell of row">{{ cell }}</td>
</tr>

我将像这样传递类型和 columnPosition 的@inputs:

  @Input() public sortByColumnPosiition = 1;
  @Input() public sortByType = 'asc';

这些解释了我要排序的列和类型解释了方向,例如描述。

这是我当前的排序示例:

  sortByColumnPosition = 0;
  sortByType = 0;

  public sortBy(data: Array<Array<any>>) {
    return [ ...data ].sort((a, b) => a[ this.sortByColumnPosition ].localeCompare(b[ this.sortByColumnPosition ]) * this.sortByType);
  }

以上是我目前的尝试 - 但仅适用于第 0 列而不适用于第 1 列

【问题讨论】:

  • 请告知预期输出。
  • 我想按位置排序,例如列所以 0、1 或 2,然后在 asc 和 desc 中
  • 感谢@RolandStarke,我现在已经做到了——我将如何制作 asc 或 desc?
  • lodash 使这样的操作相当简单,并且在传入的集合不是数组的情况下采取了“防御性”措施。

标签: javascript arrays angular sorting multidimensional-array


【解决方案1】:

如果您使用 angular,您可以使用管道在 asc/desc 中进行排序

import { Pipe, PipeTransform } from "@angular/core";
@Pipe({
  name: "sort"
})
export class ArraySortPipe  implements PipeTransform {
  transform(array: any, field: string): any[] {
    if (!Array.isArray(array)) {
      return;
    }
    function sortBy(arr, field){
     let type = 1;
     let col = 0;
     if(field == 'DESC'){
       type = -1;
       col = 0;
     }
     return [...arr].sort((a,b) => a[col].localeCompare(b[col]) * type)
    }
    sortBy(array,field)
   }
}


<tr ls-table-row class="child-row" *ngFor="let row of tableRows | sort:'ASC'>
 <td ls-table-cell *ngFor="let cell of row">{{ cell }}</td>
</tr>

【讨论】:

    【解决方案2】:

    您可以使用.localeCompare() 来检查哪个字符串按排序顺序排在第一位。

    const tableRows = [
      [ 'zz', 'cc' ],
      [ 'aa', 'cc' ],
      [ 'uu', 'dd' ]
    ];
    
    function sortAscending(arr) {
      // To avoid mutating the original array, make a deep copy
      const arrToSort = Array.from(arr);
      
      return arrToSort.sort(([a, b], [c, d]) => a.localeCompare(c) || b.localeCompare(d));
    }
    
    function sortDescending(arr) {
        // To avoid mutating the original array, make a deep copy
      const arrToSort = Array.from(arr);
      
      return arrToSort.sort(([a, b], [c, d]) => c.localeCompare(a) || d.localeCompare(b));
    }
    
    const sortedAscArr = sortAscending(tableRows);
    const sortedDescArr = sortDescending(tableRows);
    
    console.log(sortedAscArr);
    console.log(sortedDescArr);

    【讨论】:

      【解决方案3】:

      您可以创建一个接受数组、列号和排序顺序(asc/desc)的函数。

      您可以使用一个技巧来使用相同的函数进行 asc/desc 排序。有一个变量,其值为1-1。始终将其与每个结果或sort() 回调相乘。如果您将通过1,它将为-1 进行升序和降序排序

      const tableRows = [
        ['zz', 'cc'],
        ['aa', 'cc'],
        ['uu', 'dd']
      ];
      
      function sortBy(arr, col, type = 1) {
        return [...arr].sort((a, b) => a[col].localeCompare(b[col]) * type)
      }
      
      console.log(sortBy(tableRows, 1)) //asc
      console.log(sortBy(tableRows, 0, -1)) //desc

      【讨论】:

      • 是 asc / desc 类型吗?
      • @AngularM 是的。它的 asc 和 desc
      • @AngularM 如果您对答案感到满意,请考虑接受。
      • 嗨,还有一个问题。您的代码仅适用于第一列,而不适用于第二列。我已将上面的代码更新为最新尝试
      • 它的 1 或 -1 表示方向 - 我在做 1 和 0
      猜你喜欢
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      • 2020-03-06
      • 2023-04-04
      • 2020-09-12
      相关资源
      最近更新 更多