Привет, у меня есть массив объектов, которые я хочу отсортировать на основе логического значения, которое имеет один из объектов. Однако обычно были бы либо 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);
Это просто совсем не сработало.
Я не смог найти случай, который был бы достаточно похож, чтобы основывать на нем решение, поэтому, надеюсь, я смогу найти его здесь.
Кстати, обратный вызов для sort
принимает только два параметра.
@evolutionxbox истина > ноль > ложь
Если вам нравится использовать пользовательскую сортировку, вы можете взять объект с желаемой сортировкой, например
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, верно, это тоже работает, но не позволяет использовать значение по умолчанию, если вы хотите переместить неизвестные значения вверх, вниз или между ними.
order
в этом случае объект, в котором сохраняется желаемый заказ? Итак const order = { true: 1, null: 2, false: 3 }
@MarnixElling, это так. см. редактирование.
Я предполагаю, что это работает, если в массиве были только логические значения, но это массив объектов, где 1 свойство каждого объекта является логическим, я пытался расширить order[a] - order[b]
в order[a.boolean] - order[b.boolean]
, но это не работает, что мне не хватает ?
@MarnixElling, пожалуйста, добавьте небольшой набор данных.
@NinaScholz Я отредактировал пост с примером
Вы можете явно проверить наличие 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);
Вы можете закомментировать другой текст, когда он не нужен.
На самом деле вопрос заключается в том, чтобы сортировать массив объектов с логическим свойством, а не сортировать логический массив. Вы можете проверить вопрос еще раз и улучшить свой ответ.
В каком порядке вы хотите их видеть?