Функция сортировки для ключей в объекте с закрытием - Javascript - PullRequest
2 голосов
/ 29 сентября 2019

Я создаю индивидуальную функцию для каждой клавиши в объекте следующим образом:

Объект

let users = [
  { name: "John", age: 20, surname: "Johnson" },
  { name: "Pete", age: 18, surname: "Peterson" },
  { name: "Ann", age: 19, surname: "Hathaway" }
];

Простая функция сортировки

// Sorting by name (Ann, John, Pete)
users.sort((a, b) => a.name > b.name ? 1 : -1);

// Sorting by age (Pete, Ann, John)
users.sort((a, b) => a.age > b.age ? 1 : -1);

Работает хорошо, но мне нужно создать динамическую функцию с замыканием, которая будет вызываться так:

users.sort(byField('name')); вместо users.sort((a, b) => a.name > b.name ? 1 : -1);

Пока я пробовал это:

function byField(str) {
  return (a, b) => a.str > b.str ? 1 : -1;
}

console.table(users.sort(byField('name')));
console.table(users.sort(byField('age')));

Но он просто возвращает несортированный объект.

1 Ответ

1 голос
/ 29 сентября 2019

Вам необходим метод доступа к свойству с квадратными скобками и функцией, которая работает симметрично и учитывает те же значения.

Узнайте больше о функциях, которые возвращают только часть, например, -1и 1 или просто логическое значение: Сортировка в JavaScript: разве не достаточно возврата логического значения для функции сравнения?

const withKey = key => (a, b) => (a[key] > b[key]) - (a[key] < b[key]);

let users = [{ name: "John", age: 20, surname: "Johnson" }, { name: "Pete", age: 18, surname: "Peterson" }, { name: "Ann", age: 19, surname: "Hathaway" }];

console.log(users.sort(withKey('name')));
console.log(users.sort(withKey('age')));
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...