Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Преобразование первого массива во второй с помощью стандартных функций работы с масси (https://javascript.ru/forum/misc/40108-preobrazovanie-pervogo-massiva-vo-vtorojj-s-pomoshhyu-standartnykh-funkcijj-raboty-s-massi.html)

Shitbox2 24.07.2013 06:23

Преобразование первого массива во второй с помощью стандартных функций работы с масси
 
Массив уникальных айдишников:
[1, 4, 32, 2, 5, 7, 8]

обновленный массив (содержащий незначительные отличия от исходного):
[4, 8, 17, 32, 2, 7, 9, 3]

Нужно, используя стандартные функции работы с массивами push, pop, shift, unshift, splice, преобразовать первый массив во второй наиболее быстрым способом. Отличия между массивами, как правило, в нескольких элементах.

Существуют ли готовые алгоритмы? Ваш вариант?

danik.js 24.07.2013 06:56

Цитата:

Сообщение от Shitbox2
преобразовать первый массив во второй наиболее быстрым способом

С практической точки зрения или с точки зрения сложности алгоритма?

Shitbox2 24.07.2013 11:52

Разумеется, массивы могут быть любыми. По сути во втором массиве добавлены элементы в начало или конец, удалены произвольные элементы или поменялась позиция элемента. Нам надо расшифровать изменения и применить их к первому массиву с помощью обозначенных функций. Желательно не трогать совпадающие элементы, чтобы они не перерисовывались лишний раз.

Стоит уточнить, что к первому массиву у нас нет доступа. Мы его можем менять только через функции (это не функции js это функции стороннего плагина)

Представьте, что первому массиву соответствуют элементы в DOM и если мы, например, удаляем элемент из середины или перетаскиваем элемент на другую позицию не должен перерисовываться весь список.

Shitbox2 24.07.2013 14:06

Не очень понимаю, зачем нужна apply?

a1.push(a2);
Разве так работать не будет?

Shitbox2 24.07.2013 19:29

...туплю. Тогда вопрос по-другому, почему работает с apply?

nerv_ 24.07.2013 19:55

Цитата:

Сообщение от Shitbox2
Преобразование первого массива во второй

просто взять второй массив нельзя? Зачем все это велосипедирование?

Shitbox2 24.07.2013 20:29

Цитата:

А почему не должно? Второй аргумент разворачивается из массива в цепочку аргументов.
Тогда что, вообще, делает apply? Может быть мы о разных функциях?

Цитата:

просто взять второй массив нельзя? Зачем все это велосипедирование?
Нельзя. push, pop, ... splice это не функции js, это функции стороннего плагина, который работает внутри себя с первым массивом, строит DOM и т.д. Читать первый массив можно, но изменять только через этот плагин.

edison 25.07.2013 02:15

Цитата:

Тогда что, вообще, делает apply? Может быть мы о разных функциях?
Ответ же выше был дан))) И в том сообщении которое было отквочено)

Цитата:

А почему не должно? Второй аргумент разворачивается из массива в цепочку аргументов.
пример который выше давали
var a = [1, 2, 3]; a.push([4, 5, 6]);
console.log(a);


и два примера для сравнения
var a = [1, 2, 3]; a.push(4, 5, 6);
console.log(a);


var a = [1, 2, 3];a.push.apply(a,[4, 5, 6]);
console.log(a);


синтаксис push
array.push( elem1, elem2, ... )
а не
array.push( array1, array2, ... )
а в apply можно запихать массив аргументов, с которым будет вызвана функция
соответственно a.push.apply(a,[4, 5, 6]) приравнивается к a.push(4, 5, 6)

Shitbox2 29.07.2013 07:44

Задача решена. 3 дня сидел, не думал, что такой тупой.

До конца прояснил в голове условия: необходимо преобразовать один массив в другой с минимальным количеством перестановок. Так же в конечном массиве могут присутствовать элементы, которых нет в начальном или, наоборот, какие-то отсутствовать. Алгоритм должен быть оптимизирован для ситуаций добавления/удаления/перестановки одного элемента.

Получилось вот что:
http://plnkr.co/edit/clW0aVqzaisUkUo44EOL?p=preview

Сложность от O(3n) до O(4n), т.е. линейная. Меньше всего операций удаления/вставки при отличии в одном элементе, больше всего — когда элементы идут в обратном порядке. Предполагалось, что элементы в массивах уникальны, хотя работает и с одинаковыми (тут особо не тестировал). Если кто-то подскажет вариант с еще меньшим количеством перестановок, будет здорово, но, думаю, меньше уже некуда.

nerv_ 29.07.2013 11:08

Цитата:

Сообщение от Shitbox2
push, pop, ... splice это не функции js, это функции стороннего плагина

в таком случае, не проще ли сперва преобразовать в настоящие массивы js, затем сделать как писал Дзен-трансгуманист, а потом одним "махом" заменить?


Часовой пояс GMT +3, время: 19:02.