В JavaScript как отсортировать массив массивов по asc / desc - PullRequest
1 голос
/ 20 мая 2019

Технология: 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>

Я буду передавать @inputs типа и columnPosition так:

  @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

Ответы [ 3 ]

3 голосов
/ 20 мая 2019

Вы можете создать функцию, которая принимает Array, номер столбца и порядок сортировки (asc / desc).

Вы можете использовать трюк, чтобы использовать ту же функцию для сортировки asc / desc. Есть переменная, значение которой будет 1 или -1. Всегда умножайте его на каждый результат или sort() обратный вызов. Если вы передадите 1, он будет сортировать asc и desc для -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
0 голосов
/ 20 мая 2019

Если вы используете угловой, вы можете использовать трубы для сортировки в 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>
0 голосов
/ 20 мая 2019

Вы можете использовать .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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...