Сортировать массив объектов с неопределенными и нулевыми значениями - PullRequest
0 голосов
/ 01 мая 2020

Как я могу отсортировать массив объектов, который имеет нулевые и неопределенные значения, используя javascript. Моя цель - сначала показать элементы, у которых есть свойство «jobTitle», упорядочить их по рейтингу, затем элементы без «jobTitle», упорядоченные по рейтингу. Данные:

data = [
  {name: 'John', rating: null},
  {name: 'Ethel', rating: 1.34, jobTitle: 'engineer'},
  {name: 'Abba', rating: 5.44},
  {name: 'Harry', rating: 0.44, jobTitle: 'plumber'}
]

После того, как данные отсортированы по jobTitle, а затем по рейтингу, они должны выглядеть следующим образом:

[
  {name: 'Ethel', rating: 1.34, jobTitle: 'engineer'},
  {name: 'Harry', rating: 0.44, jobTitle: 'plumber'},
  {name: 'Abba', rating: 5.44},
  {name: 'John', rating: null}
]

Я пробовал много вариантов, таких как:

data.sort(function (a, b) {
  var x = a[key]; var y = b[key];
  return ((x > y) ? -1 : ((x < y) ? 1 : 0));
});

но он не работал для неопределенных и нулевых значений. Я не хочу использовать некачественные решения, такие как создание новых массивов, заполнение данными и их объединение. Я хочу добиться этого одним способом, если это возможно.

РЕДАКТИРОВАТЬ

В общем ответе должны сначала показываться те, у кого jobTitle упорядочен по рейтингу И тогда те, у кого нет jobTitle ТАКЖЕ упорядочены по рейтингу.

Ответы [ 3 ]

3 голосов
/ 01 мая 2020

Вы можете проверить каждое условие и вернуть ответ на обратный вызов ожидаемым образом.

data = [
  {name: 'John', rating: null},
  {name: 'Ethel', rating: 1.34, jobTitle: 'engineer'},
  {name: 'Abba', rating: 5.44},
  {name: 'Harry', rating: 0.44, jobTitle: 'plumber'}
];


data.sort((a, b) => {
  if(a.jobTitle && b.jobTitle) {
    return (b.rating || 0) - (a.rating || 0);
  } else if(a.jobTitle || b.jobTitle) {
    return !(a.jobTitle) - !(b.jobTitle)
  } else  {
    return (b.rating || 0) - (a.rating || 0);
  }
});
console.log(data)
0 голосов
/ 01 мая 2020

Я бы рекомендовал разбить ваш код на 2 вида и использовать их по порядку.

let result = [
  {name: 'John', rating: null},
  {name: 'Peter', rating: null},
  {name: 'Harry', rating: 0.44, jobTitle: 'plumber'},
  {name: 'Harry', rating: 0.50, jobTitle: 'plumber'},
  {name: 'Anderson', rating: 1.34, jobTitle: 'mascot'},
  {name: 'Ethel', rating: 1.34, jobTitle: 'engineer'},
  {name: 'Abba', rating: 5.44}
]
result.sort(by_rating);
result.sort(by_job_title);
console.log(result)

function by_job_title(a, b ){
  if( typeof a.jobTitle === 'undefined' && typeof a.jobTitle === 'undefined' ) return 0;
  if( typeof b.jobTitle === 'undefined' ) return -1;
  if( typeof a.jobTitle === 'undefined' ) return 1;
  
  let title_a = a.jobTitle.toLowerCase();
  let title_b = b.jobTitle.toLowerCase();
  
  if( title_a === title_b ) return 0;
  if( title_a > title_b ) return 1;
  else return -1;
}

function by_rating( a, b ) {
  // notice that this works with null, only because null will be casted to 0
  if( a.rating === b.rating ) return 0;
  if( a.rating > b.rating ) return -1;
  else return 1;
}
0 голосов
/ 01 мая 2020

В вашей функции сортировки вы можете проверить, является ли значение null или undefined, и в этом случае вернуть 1, поэтому оно сортируется в конец массива. Как примечание: вы сортируете массив, а не строку JSON. Строка JSON не может содержать значение примитива undefined, хотя оно действительно Javascript.

data.sort(function (a, b) {
  var x = a[key];
  var y = b[key];
  if (x === null || x === undefined) {
    return 1;
  }
  return y - x;
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...