Javascript сортировать массив строк по фамилии - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть массив:

arr4=["John Alpha","Allen Beta", "Elle Cappa"];

У меня есть функция сортировки, которая сортирует массив строк в порядке убывания

function getSize(arr){
return arr.length;
}

function sortStringArrDes(arr){
arrSize=getSize(arr);
var temp;
for(j=0; j<arrSize-1; j++){
    for(i=0; i<arrSize-1; i++){
        if (arr[i] < arr[i+1]){
            temp = arr[i+1];
            arr[i+1] = arr[i];
            arr[i] = temp;
            }
        }
    }
    return arr;
}

Можно ли отсортировать массив по фамилии, используя sortStringArrDes илиЕсть ли другой, менее сложный способ сделать это?

Ответы [ 6 ]

0 голосов
/ 25 февраля 2019

Вот один вкладыш

arr4.sort(x => arr4.map(y => y.split(' ')[1]) ).reverse()
0 голосов
/ 25 февраля 2019

Другое решение этой проблемы может быть достигнуто с помощью Array.sort () в сочетании с String.match () и уже упомянутым String.localeCompare () .Обратите внимание, это также будет работать, если у вас есть составные фамилии.

const input = ["John Alpha", "Elle Cappa", "Allen Beta", "Rob Collyses Chung"];

input.sort(
    (a, b) => b.match(/\s(.+)/)[1].localeCompare(a.match(/\s(.+)/)[1])
);

console.log(input);

Более того, вы также должны заметить, что Array.sort() будет мутировать ваш исходный массив, если вы этого не хотите, вы можете создать копию массиваперед сортировкой, используя Array.slice () .Пример:

const input = ["John Alpha", "Elle Cappa", "Allen Beta", "Rob Collyses Chung"];

let res = input.slice().sort(
    (a, b) => b.match(/\s(.+)/)[1].localeCompare(a.match(/\s(.+)/)[1])
);

console.log("Original is not mutated: ", input);
console.log("Sorted copy: ", res);
0 голосов
/ 25 февраля 2019

Другое решение состоит в том, чтобы использовать два цикла for, разбить каждый элемент массива, обратить его и отсортировать.Затем переверните его после сортировки и снова соедините.Смотрите код ниже:

var arr4=["Allen Beta", "John Alpha", "Elle Cappa"];
var arr5 = []; // Keep the original array as is.
for(var i = 0; i <  arr4.length; i++){
	arr5[i] = arr4[i].split(" ").reverse().join(" ");
}
arr5.sort();
for(var i = 0; i < arr5.length; i++){
	arr5[i] = arr5[i].split(" ").reverse().join(" ");
}

console.log(arr5); // a b c
console.log(arr5.reverse()); // c b a
0 голосов
/ 25 февраля 2019

Вместо того, чтобы пытаться заново изобрести колесо, вы можете использовать собственный метод Array.prototype.sort:

const arr4 = ["John Alpha", "Elle Cappa", "Allen Beta"];
arr4.sort((a, b) => b.split(' ')[1].localeCompare(a.split(' ')[1]));
console.log(arr4);

.localeCompare() возвращает целое число, представляющее, является ли вызываемая или переданная строка первой в алфавитном порядке.

0 голосов
/ 25 февраля 2019

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

var names = ["Allen Beta", "John Alpha", "Elle Cappa"];
var sortedNames = names.sort(compare);
console.log(sortedNames);

function compare(a, b) {
  var splitA = a.split(" ");
  var splitB = b.split(" ");
  var lastA = splitA[splitA.length - 1];
  var lastB = splitB[splitB.length - 1];

  if (lastA < lastB) return -1;
  if (lastA > lastB) return 1;
  return 0;
}
0 голосов
/ 25 февраля 2019

Здесь я использую .split(' ')[1], чтобы получить фамилию для условия, и похоже, что она будет работать.

arr4=["John Alpha","Allen Beta", "Elle Cappa"];

function sortStringArrDes(arr){
arrSize=arr.length;
var temp;
for(j=0; j<arrSize-1; j++){
    for(i=0; i<arrSize-1; i++){
        if (arr[i].split(' ')[1] < arr[i+1].split(' ')[1]){
            temp = arr[i+1];
            arr[i+1] = arr[i];
            arr[i] = temp;
            }
        }
    }
    return arr;
}

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