JS толкает один элемент массива до конца - PullRequest
0 голосов
/ 29 октября 2018

Я пытаюсь изменить порядок сортировки массива. Допустим, у меня есть следующая структура

    const array = [{
     location: 'Table 2',
     data: {..}
    }, {
     location: 'Unassigned',
     data: {..}
    }, {
     location: 'Table 1',
     data: {..}
}
];

Как правильно перемещать «Таблицу 1» в индекс 0, «Таблицу 2» сразу после нее (сохраняйте тот же порядок для Таблицы 3, 4 и т. Д.) И «Неназначенный» всегда до конца. Желательно с lodash.

Вот что я попробовал до сих пор

  forEach(allItemsSorted, (item, index) => {
    const total = allItemsSorted.length;
    let hasUnassigned = false;
    if (item.location === 'Unassigned') {
      allItemsSorted[total] = item;
      hasUnassigned = true;
    }
    if (hasUnassigned && index === total) {
      return;
    }
    allItemsSorted[index] = item;
  })

Ответы [ 5 ]

0 голосов
/ 29 октября 2018

Как насчет этого

var data1 = [{location:'Table 2', data: {}}, {location: 'Unassigned', data: {}}, {location: 'Table 1', data: {}}, {location: 'Table 12', data: {}}, {location: 'Table 22', data: {}}, {location: 'Unassigned', data: {}}];

data.sort((a,b)=> a.location > b.location).filter(item => item.location != 'Unassigned').push([...data.filter(item => item.location == 'Unassigned')]);

Результат

[{
"location": "Table 1",
"data": {}
},
{
"location": "Table 12",
"data": {}
},
{
"location": "Table 2",
"data": {}
},
{
"location": "Table 22",
"data": {}
},
{
"location": "Unassigned",
"data": {}
},
{
"location": "Unassigned",
"data": {}
}]
0 голосов
/ 29 октября 2018

Если вы хотите переставить массив, всегда ищите метод Array.sort. Создание нового массива с пользовательским добавлением вызовет только трудности.

Вы можете попробовать что-то вроде этого:

  • Создайте функцию, которая принимает location и возвращает числовое значение.
  • Используйте это значение для сортировки в любом порядке.

const array = [
  {location:'Table 2', data: {}},
  {location: 'Unassigned', data: {}},
  {location: 'Table 1', data: {}},
  {location: 'Table 11', data: {}},
  {location: 'Table 31', data: {}},
  {location: 'Table 3', data: {}},
];

array.sort(function(a,b) {
  return getSortValue(a.location) - getSortValue(b.location);
});

function getSortValue(location) {
  return location === 'Unassigned' ? Number.MAX_SAFE_INTEGER : location.match(/\d+/)[0];
}

console.log(array)
0 голосов
/ 29 октября 2018

Вы можете использовать Array.sort() - всегда перемещайте Unassigned в конец (два if с). Сортируйте другие элементы, используя String.localeCompare() с опцией numeric .

Примечание: Я использую распространение массива - [...array] - для клонирования массива, поэтому оригинал не будет видоизменяться. Вы можете пропустить это, если хотите изменить исходный массив.

const array = [{location:'Table 27'}, {location:'Table 2'}, {location: 'Unassigned'}, {location: 'Table 11'}];

const result = [...array].sort(({ location: a }, { location: b }) => {
  if(a === 'Unassigned') return 1;
  if(b === 'Unassigned') return -1;
  
  return a.localeCompare(b, undefined, {numeric: true});
});

console.log(result);
0 голосов
/ 29 октября 2018

Как насчет выполнения сортировки на array, если у вас есть location значения, начинающиеся с Table, а неназначенные имеют Unassigned в качестве значения. Будет работать для этого сценария. Но будьте осторожны с другими значениями, если они не соответствуют ожидаемому результату.

const array = [{location:'Table 2', data: {}}, {location: 'Unassigned', data: {}}, {location: 'Table 1', data: {}}];
array.sort(function(a,b){
  return a.location.localeCompare(b.location);
});
console.log(array);
0 голосов
/ 29 октября 2018

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

const
    array = [{ location: 'Table 2', data: {} }, { location: 'Unassigned', data: {} }, { location: 'Table 1', data: {} }],
    order = { 'Table 1': 1, 'Table 2': 2, default: Infinity };

array.sort(({ location: a }, { location: b }) =>
    (order[a] || order.default) - (order[b] || order.default));

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

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

const
    array = [{ location: 'Table 2', data: {} }, { location: 'Unassigned', data: {} }, { location: 'Table 1', data: {} }],
    order = { Unassigned: 1 };

array.sort(({ location: a }, { location: b }) =>
    (order[a] || 0) - (order[b] || 0) || a.localeCompare(b));

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