Сортировка массива, содержащего текст с пробелами - PullRequest
4 голосов
/ 13 января 2020

Я пытаюсь отсортировать массив, содержащий строки. Каждое значение обычно имеет следующую структуру: [регистрационный номер] [] [номер счета] [,] [имя учетной записи]

Но в редких случаях значение не имеет первых 4 рег. Номеров + пробел.

Это пример массива:

var accounts = ["1111 12345678, Account1", 
              "2222 12345678, Account2", 
              "11345678, Account3", 
              "12345678, Account4", 
              "3333 12345678, Account5"];

Я могу сортировать учетные записи с помощью account.sort (), и это работает почти нормально. НО я хотел бы, чтобы значения были отсортированы И чтобы значения без reg.no отображались последними в отсортированном массиве (все еще сортируются в алфавитном порядке).

Таким образом, сортировка массива счетов должна привести к следующему списку:

1111 12345678, Account1
2222 12345678, Account2
3333 12345678, Account5
11345678, Account3
12345678, Account4

Любое хорошее предложение к этому?

Ответы [ 3 ]

2 голосов
/ 13 января 2020

Вы хотите проверить ведущие числа и отсортировать их по началу.

const hasLeading = s => /^\S+\s\S+\s\S+$/.test(s);

var accounts = ["1111 12345678, Account1", "2222 12345678, Account2", "11345678, Account3", "12345678, Account4", "3333 12345678, Account5"];

accounts.sort((a, b) => hasLeading(b) - hasLeading(a) || a > b || -(a < b));

console.log(accounts);
0 голосов
/ 13 января 2020
  1. Получить все элементы, содержащие> 2 пробела. Сортировать этот массив.
  2. Получить все элементы, содержащие === 2 пробела.

let arr = ["3333 12345678, Account5","1111 12345678, Account1", 
              "2222 12345678, Account2", 
              "11345678, Account3", 
              "12345678, Account4", 
              ];
              
              
let arr1 = arr.filter((a) => {
  return a.split(' ').length > 2;
});

let sortedArr = arr1.sort();

let appendArr = arr.filter((a) => {
  return a.split(' ').length === 2;
});

sortedArr = [...sortedArr, ...appendArr];

console.log(sortedArr);
0 голосов
/ 13 января 2020

Вы можете сделать это так:

var accounts = ["1111 12345678, Account1", 
              "2222 12345678, Account2", 
              "11345678, Account3", 
              "12345678, Account4", 
              "3333 12345678, Account5"];


function compare(a, b) {
  var aArr = a.split(' ');
  var bArr = b.split(' ');
  if (aArr.length > 2 && bArr.length > 2) {
    return aArr[2] > bArr[2];
  } else if (aArr.length > 2) {
    return -1;
  }  else if (bArr.length > 2) {
    return 1;
  } else {
    return aArr[1] > bArr[1];
  }
}

console.log(accounts.sort(compare))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...