Можно ли отсортировать и переставить массив, который выглядит следующим образом:
itemsArray = [
['Anne', 'a'],
['Bob', 'b'],
['Henry', 'b'],
['Andrew', 'd'],
['Jason', 'c'],
['Thomas', 'b']
]
чтобы соответствовать расположению этого массива:
sortingArr = [ 'b', 'c', 'b', 'b', 'a', 'd' ]
К сожалению, у меня нет никаких идентификаторов для отслеживания. Мне нужно было бы расставить приоритеты для массива items, чтобы максимально приблизить sortingArr.
Обновить:
Вот результат, который я ищу:
itemsArray = [
['Bob', 'b'],
['Jason', 'c'],
['Henry', 'b'],
['Thomas', 'b']
['Anne', 'a'],
['Andrew', 'd'],
]
Есть идеи, как это можно сделать?
javascript
user1448892
источник
источник
Ответы:
Что-то вроде:
Вот более короткий код, но он уничтожает
sorting
массив:источник
Ответ в одну строку.
источник
itemsArray
. В зависимости от требований к производительности это будет намного безопаснееitemsArray.slice().sort(...)
.sortingArr
должен содержать все значения вitemsArray
. Исправление заключается в том, чтобыsortingArr
allProducts.sort((product1, product2) => { const index1 = manualSort.indexOf(product1.id); const index2 = manualSort.indexOf(product2.id); return ( (index1 > -1 ? index1 : Infinity) - (index2 > -1 ? index2 : Infinity) ); });
Если вы используете встроенную функцию сортировки массива, вы можете передать собственный компаратор, который будет использоваться при сортировке массива. Компаратор должен вернуть отрицательное число, если первое значение меньше второго, ноль, если они равны, и положительное число, если первое значение больше.
Так что, если я правильно понимаю пример, который вы приводите, вы можете сделать что-то вроде:
источник
indexOf
возвращает первый индекс.sortingArr
являются уникальными - что, к счастью, они в моем случае :)sortingArray
внешнюю часть функции, чтобы избежать повторного объявления ее на каждой итерации сортировкиСлучай 1: Оригинальный вопрос (без библиотек)
Множество других ответов, которые работают. :)
Случай 2: оригинальный вопрос (Lodash.js или Underscore.js)
Случай 3: Сортировка Array1, как если бы это был Array2
Я предполагаю, что большинство людей пришли сюда в поисках эквивалента PHP для array_multisort (я так и сделал), поэтому я решил опубликовать этот ответ. Есть пара вариантов:
1. Существует реализация JS для array_multisort () . Спасибо @Adnan за указание на это в комментариях. Это довольно большой, хотя.
2. Напишите свой собственный. ( JSFiddle demo )
3. Lodash.js или Underscore.js (обе популярные, небольшие библиотеки, ориентированные на производительность) предлагают вспомогательные функции, которые позволяют вам сделать это:
... Который (1) сгруппирует массив sortArray в
[index, value]
пары, (2) отсортирует их по значению (вы также можете указать обратный вызов здесь), (3) замените каждую из пар элементом из itemArray по индексу пара возникла из.источник
возможно, это слишком поздно, но вы также можете использовать некоторую модифицированную версию кода ниже в стиле ES6. Этот код для массивов, таких как:
Фактическая операция:
Фактическая работа в ES5:
Должен привести к
arrayToBeSorted = [3,5]
Не уничтожает ссылочный массив.
источник
[{name: "1"}, {name: "2"}, {name: "3"}, ...]
.Я бы использовал промежуточный объект (
itemsMap
), таким образом избегая квадратичной сложности:Смотрите http://jsfiddle.net/eUskE/
источник
http://jsfiddle.net/s7b2P/
Результирующий порядок: Боб, Джейсон, Генри, Томас, Энн, Эндрю
источник
Почему не что-то вроде
Функция карты может быть доступна не во всех версиях
Javascript
источник
источник
Это то, что я искал и сделал для сортировки массива массивов на основе другого массива:
источник
Я должен был сделать это для полезной нагрузки JSON, которую я получаю от API, но это было не в том порядке, в котором я этого хотел.
Массив, который будет ссылочным массивом, который вы хотите отсортировать по второму массиву:
Я сделал это как объекты, потому что в конечном итоге они будут иметь другие свойства.
Создан массив:
Использовал это с набором результатов из базы данных. Я не знаю, насколько это эффективно, но с небольшим количеством столбцов, которые я использовал, все работало нормально.
источник
Для получения нового упорядоченного массива вы можете взять
Map
и собрать все элементы с требуемым ключом в массиве и отобразить требуемые упорядоченные ключи, взяв просеянный элемент требуемой группы.источник
{}
вместоMap
🤷♂️Это решение добавит объекты в конце, если сортировочный ключ отсутствует в ссылочном массиве.
источник
это должно работать:
источник
Вы можете попробовать этот метод.
источник
ES6
Еще примеры с разными входными массивами
источник
В случае, если вам нужно сделать это с массивом объектов, вот адаптация удивительного ответа @Durgpal Singh:
источник
Используйте метод $ .inArray () из jQuery. Затем вы могли бы сделать что-то вроде этого
источник
Используйте пересечение двух массивов.
Пример:
=> ['a', 'b', 'e']
если z и s находятся вне диапазона первого массива, добавьте его в конец результата
источник
Вы можете сделать что-то вроде этого:
Вы можете проверить это здесь .
Примечание: это предполагает, что массивы, которые вы передаете, имеют эквивалентный размер, вам нужно добавить некоторые дополнительные проверки, если это не так.
ссылка ссылка
обращаться
источник