Если вы хотите версию на npm, array-move является ближайшим к этому ответу, хотя это не та же реализация. Дополнительную информацию см. В разделе использования. Предыдущая версия этого ответа (модифицированного Array.prototype.move) может быть найдена на npm в array.prototype.move .
У меня был довольно хороший успех с эта функция:
function array_move(arr, old_index, new_index) {
if (new_index >= arr.length) {
var k = new_index - arr.length + 1;
while (k--) {
arr.push(undefined);
}
}
arr.splice(new_index, 0, arr.splice(old_index, 1)[0]);
return arr; // for testing
};
// returns [2, 1, 3]
console.log(array_move([1, 2, 3], 0, 1));
Обратите внимание, что последний return
просто предназначен для тестирования: splice
выполняет операции над массивом на месте, поэтому возврат не требуется. В дополнение, этот move
является операцией на месте. Если вы хотите избежать этого и вернуть копию, используйте slice
.
Выполняя код:
new_index
больше длины массива, мы хотим (я полагаю) правильно разместить массив с новыми undefined
s. Этот небольшой фрагмент обрабатывает это, нажимая undefined
на массив до тех пор, пока мы не получим правильную длину. arr.splice(old_index, 1)[0]
мы соединим старый элемент. splice
возвращает элемент, который был сращирован, но находится в массиве. В нашем примере выше это было [1]
. Итак, мы берем первый индекс этого массива, чтобы получить там исходный 1
. splice
для вставки этого элемента в место new_index. Поскольку мы добавили массив выше, если new_index > arr.length
, он, вероятно, появится в нужном месте, если только они не сделали что-то странное, как передать отрицательное число. Более благоприятная версия для учета отрицательных индексов:
function array_move(arr, old_index, new_index) {
while (old_index < 0) {
old_index += arr.length;
}
while (new_index < 0) {
new_index += arr.length;
}
if (new_index >= arr.length) {
var k = new_index - arr.length + 1;
while (k--) {
arr.push(undefined);
}
}
arr.splice(new_index, 0, arr.splice(old_index, 1)[0]);
return arr; // for testing purposes
};
// returns [1, 3, 2]
console.log(array_move([1, 2, 3], -1, -2));
Что должно учитывать такие вещи, как array_move([1, 2, 3], -1, -2)
правильно (переместите последний элемент во второе и последнее место). Результат для этого должен быть [1, 3, 2]
.
В любом случае, в вашем исходном вопросе вы сделаете array_move(arr, 0, 2)
для a
после c
. Для d
до b
вы сделали бы array_move(arr, 3, 1)
.
Обычно это решено путем создания и развертывания modulename-test.jar файлов в дополнение к регулярному modulename.jar файлу. Вы развертываете их на repos как регулярные артефакты. Это не полностью безупречно, но работает прилично на артефакты кода.
Тогда Вы добавили бы, что тест определил объем зависимостей к тестовым банкам к другим модулям.
можно также решить, это путем помещения теста определило объем артефактов в "основном" объеме в отдельном собственном модуле, и затем включайте это в регулярный тестовый объем в других модулях. Это решение не работает очень хорошо в сборке мультимодуля, куда каждый модуль экспортирует некоторые тестовые артефакты, так как Вы в основном получаете модули на 2 Н.
Многие из нас на самом деле разочаровываются в обоих из них решение, когда мы понимаем, что количество классов справедливо ограничено и существуют проблемы, связанные с обоими из них решение. Мы просто помещаем их в соответственно именованный пакет в "основном" объеме. Я просто продолжаю забывать, почему двумя первыми решениями является боль.
Вы можете развернуть тестовый код в качестве дополнительного артефакта, используя цель test-jar maven-jar-plugin . Он будет прикреплен к проекту и развернут вместе с тестами классификатора.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
Другие проекты могут затем ссылаться на тестовый контейнер, объявив классификатор тестов в зависимости.
<dependency>
<groupId>name.seller.rich</groupId>
<artifactId>foo</artifactId>
<version>1.0.0</version>
<classifier>tests</classifier>
<scope>test</scope>
</dependency>