Как отсортировать массив объектов с логическими значениями: true, false и null

Привет, у меня есть массив объектов, которые я хочу отсортировать на основе логического значения, которое имеет один из объектов. Однако обычно были бы либо true, либо false, но в этом случае мы также проверяем значения null, потому что иногда данные не были установлены, и в этом случае мы хотим показать, что они еще не установлены с помощью значка.

Вот пример массива:

const arrayOfObjects = [
  {
    id: 69,
    boolean: true,
    name: 'foo',
  },
  {
    id: 42,
    boolean: false,
    name: 'bar',
  },
  {
    id: 666,
    boolean: null,
    name: 'foo',
  },
  {
    id: 420,
    boolean: false,
    name: 'bar',
  },
  {
    id: 2,
    boolean: null,
    name: 'foo',
  },
  {
    id: 123,
    boolean: true,
    name: 'foo',
  },
]

Итак, что я попробовал сначала:

arrayOfObjects.sort((a, b) => b.boolean - a.boolean);

Это устанавливает объекты, которые находятся true впереди, но объекты с false или null разбросаны.

Затем я попробовал:

arrayOfObjects.sort((a, b, c) => (c.boolean - b.boolean) - a.boolean);

Это просто совсем не сработало.

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

В каком порядке вы хотите их видеть?

evolutionxbox 24.01.2023 16:49

Кстати, обратный вызов для sort принимает только два параметра.

Nina Scholz 24.01.2023 16:52

@evolutionxbox истина > ноль > ложь

Marnix Elling 24.01.2023 16:54
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
65
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Если вам нравится использовать пользовательскую сортировку, вы можете взять объект с желаемой сортировкой, например

const
    order = { true: 1, null: 2, false: 3 };
    data = [{ id: 69, boolean: true, name: 'foo' }, { id: 42, boolean: false, name: 'bar' }, { id: 666, boolean: null, name: 'foo' }, { id: 420, boolean: false, name: 'bar' }, { id: 2, boolean: null, name: 'foo' }, { id: 123, boolean: true, name: 'foo' }];

data.sort((a, b) => order[a.boolean] - order[b.boolean]);

console.info(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Если у вас есть неизвестные значения и вы хотите переместить их вниз, вы можете добавить еще один ключ с большим значением, например

order = { true: 1, null: 2, false: 3, bottom: Number.MAX_VALUE };

Использование:

data.sort((a, b) =>
    (order[a.boolean] || order.bottom) - (order[b.boolean] || order.bottom)
);

Я думал, что возврат сортировки должен быть -1, 0, 1? - { true: -1, null: 0, false: 1 }

evolutionxbox 24.01.2023 16:55

@evolutionxbox, верно, это тоже работает, но не позволяет использовать значение по умолчанию, если вы хотите переместить неизвестные значения вверх, вниз или между ними.

Nina Scholz 24.01.2023 16:56

order в этом случае объект, в котором сохраняется желаемый заказ? Итак const order = { true: 1, null: 2, false: 3 }

Marnix Elling 24.01.2023 16:58

@MarnixElling, это так. см. редактирование.

Nina Scholz 24.01.2023 17:04

Я предполагаю, что это работает, если в массиве были только логические значения, но это массив объектов, где 1 свойство каждого объекта является логическим, я пытался расширить order[a] - order[b] в order[a.boolean] - order[b.boolean], но это не работает, что мне не хватает ?

Marnix Elling 24.01.2023 17:06

@MarnixElling, пожалуйста, добавьте небольшой набор данных.

Nina Scholz 24.01.2023 17:06

@NinaScholz Я отредактировал пост с примером

Marnix Elling 24.01.2023 17:12

Вы можете явно проверить наличие null...

let list = [{i: 0, boolean: true}, { i: 1, boolean: null}, { i:2, boolean: false}, { i: 4, boolean: true}]

function cpBoolWithNull(a,b) {
  //if both are null return 0 to maintain a stable sort
  //if only one is null return 0 or 1 depending on the value of the other
  if (a.boolean === null) return b.boolean === null ? 0 : b.boolean ? 1 : -1;
  if (b.boolean === null) return a.boolean ? -1 : 1;

  //if both are different from null, sort true before false
  return b.boolean - a.boolean
}

console.info(list.sort(cpBoolWithNull));

Это отсортирует true ... null ... false Если вам нужен другой порядок, отрегулируйте возвращаемые значения.

Я думаю, что вы можете иметь проверку типов с JS с помощью этого простого скрипта.

let array =[true, false, null];
function check(i){
if (array[i] != null||array[i]!=false){ 

 if (array[i]!=null || array[i]!=true)document.write(" Array item"+" "+i+" "+"has the value of boolean false. ");

 if (array[i]!=true||array[i]!=false)document.write(" Array item"+" "+i+" "+"has the value of boolean true. ");

if (array[i] != true || array[i] != false  )document.write(" Array item"+" "+i+" "+"has the value of object null. ");
document.write("<br>")
}
}
check(0);
   

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

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

ColaFanta 26.01.2023 10:09

Другие вопросы по теме