JavaScript: сортировать массив объектов динамически по заданному массиву полей - PullRequest
1 голос
/ 08 января 2020

Я пытаюсь написать вспомогательную функцию в JavaScript, которая принимает несортированный массив объектов и массив полей и сортирует массив на месте на основе заданных полей. Вот что у меня есть:

const sortByFieldsInPlace = (arr, fieldNames) => {
  arr.sort((a, b) => {
    for (const field of fieldNames) {
      if (a[field] > b[field]) return 1;
      if (a[field] < b[field]) return -1;
    }
  });
};

Кажется, что пока работает:

const arr1 = [
  { name: 'A', code: 'D' },
  { name: 'B', code: 'A' },
  { name: 'A', code: 'Z' },
  { name: 'A', code: 'A' },
  { name: 'B', code: 'D' },
  { name: 'B', code: 'B' },
  { name: 'B', code: 'B' }
];
sortByFieldsInPlace(arr1, ['name', 'code'])
console.log(arr1)
// [
//   { name: 'A', code: 'A' },
//   { name: 'A', code: 'D' },
//   { name: 'A', code: 'Z' },
//   { name: 'B', code: 'A' },
//   { name: 'B', code: 'B' },
//   { name: 'B', code: 'B' },
//   { name: 'B', code: 'D' }
// ]

const arr2 = [
  { name: 'A', code: 'D' },
  { name: 'B', code: 'A' },
  { name: 'A', code: 'Z' },
  { name: 'A', code: 'A' },
  { name: 'B', code: 'D' },
  { name: 'B', code: 'B', status: 10 },
  { name: 'B', code: 'B', status: 9 }
];
sortByFieldsInPlace(arr2, ['name', 'code', 'status'])
console.log(arr2)
// [
//   { name: 'A', code: 'A' },
//   { name: 'A', code: 'D' },
//   { name: 'A', code: 'Z' },
//   { name: 'B', code: 'A' },
//   { name: 'B', code: 'B', status: 9 },
//   { name: 'B', code: 'B', status: 10 },
//   { name: 'B', code: 'D' }
// ]

Это выглядит хорошо или у кого-нибудь есть лучшее решение?

1 Ответ

1 голос
/ 08 января 2020

Ваше решение мне кажется хорошим, я бы добавил окончательный "return 0" за пределами для l oop, чтобы охватить ситуацию, когда сравниваемые объекты идентичны. Кроме этого, я думаю, что вы покрыли это.

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