Сортировать объект массива, используя фамилию в JavaScript - PullRequest
0 голосов
/ 12 октября 2019

Вот объект массива с комбинацией значений name и surname.
Как отсортировать по surname?

var myArr  = ["gopal, roy", "shaym, verma", "akash, jaiswal"];

Ответы [ 5 ]

3 голосов
/ 12 октября 2019

Предполагая, что имя после запятой является фамилией, вы можете разбить каждую внутреннюю строку на массив имен и вторых имен, а затем использовать .sort() с деструктуризацией, чтобы получить фамилии изоба внутренних массива. Затем вы можете использовать .localeCompare() для лексикографического сравнения обеих строк. Наконец, вы можете .map() снова преобразовать ваши внутренние массивы обратно в массив строк.

См. Пример ниже:

const myArr  = ["gopal, roy", "shaym, verma", "akash, jaiswal"];

const res = myArr
  .map(name => name.split(', '))
  .sort(([_, a], [__, b]) => a.localeCompare(b))
  .map(name => name.join(', '));

console.log(res);

Кроме того, для более эффективного подхода можно разделить метод .sort():

const myArr  = ["gopal, roy", "shaym, verma", "akash, jaiswal"];
const res = myArr
  .sort((a, b) => a.split(',').pop().localeCompare(b.split(',').pop()))

console.log(res);
2 голосов
/ 12 октября 2019
var myArr = ["gopal, roy", "shaym, verma", "akash, jaiswal"];

function sortBySurname(a, b) {
    if (a.split(',')[0] < b.split(',')[0]) {
        return -1;
    }
    else if (a.split(',')[0] > b.split(',')[0]) {
        return 1;
    }
    return 0;
}

myArr.sort(sortBySurname)
console.log(myArr)

Я настоятельно советую вам сделать объект, как показано ниже

let myArr=[
    {
        firstName:"gopal",
        surName:"roy"
    },
    {
        firstName:"shaym",
        surName:"verma"
    },
    {
        firstName:"akash",
        surName:"jaiswal"
    }
]

function sortBySurname(a, b) {
    if (a.surName < b.surName) {
        return -1;
    }
    else if (a.surName > b.surName) {
        return 1;
    }
    return 0;
}
myArr.sort(sortBySurname)
console.log(myArr)
0 голосов
/ 12 октября 2019

Вы можете использовать регулярное выражение, чтобы получить фамилию, затем используйте localeCompare

var myArr = ["gopal, roy", "shaym, verma", "akash, jaiswal"];
let out = myArr.sort((a, b) =>
  a.match(/, (.*)/)[1].localeCompare(b.match(/, (.*)/)[1])
);
console.log(out);
0 голосов
/ 12 октября 2019

Для одного оптимизирован для больших наборов данных. Regex можно заменить на trim. Каждая запись анализируется только один раз в кэш-памяти, и это еще больше увеличит сортировку, если записи изменяются и их необходимо пересортировать при обновлении.

const data = [
  "   gopal  , roy   ", 
  "shaym,Verma", 
  " Akash, Jaiswal    "
]

const cache = {}

const getLastName = s => (
  cache[s] = cache[s] || s.split(',')[1].trim()
)

console.log(
  data.sort(
    (a, b) => getLastName(a).localeCompare(getLastName(b))
  )
)
0 голосов
/ 12 октября 2019

Вы можете сортировать с использованием разделения и сравнения.

var myArr  = ["gopal, roy", "shaym, verma", "akash, jaiswal"];
function compare(a, b) {
    let sA = a.split(" ");
    let sB = b.split(" ");
    let lA = sA.pop();
    let lB = sB.pop();
    let n = lB.localeCompare(lA);
  
  if(n == -1) return 1;
  else return -1;
    return 0;
}
let sorted = myArr.sort(compare);
console.log(sorted);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...