Массивы Javascript: объединить 2 массива с приоритетом

Как объединить два массива разной длины, и значения более короткого массива должны иметь приоритет над значениями большего массива, но результат все равно должен иметь длину большего массива. Пожалуйста, внимательно посмотрите, как я расположил два массива ниже:

var short  = [[ 25,12],          [576, 12],          [576,584],          [ 25,584],          [ 25,12]];
var long   = [[301,12],[400,192],[602,230],[461,380],[487,584],[301,497],[115,584],[140,380],[301,12]];
// --------------------as suggested by the above
var result = [[ 25,12],[400,192],[576, 12],[461,380],[576,584],[301,497],[ 25,584],[140,380],[ 25,12]];

В приведенном выше примере кажется, что длина long в два раза больше, чем short, но она должна работать, даже если она в три раза больше или всего на один элемент длиннее.


person thednp    schedule 20.03.2016    source источник
comment
Кажется, что элементы замены коррелируют с разницей в длине массивов (более длинный массив в два раза длиннее, поэтому более короткий массив заменяет каждый второй элемент). Всегда ли длина более длинного массива будет целым числом, кратным длине более короткого массива?   -  person RobG    schedule 21.03.2016
comment
Начните с определения логики на простом английском языке, тогда всем (включая вас) будет легче понять и решить   -  person Amit    schedule 21.03.2016
comment
@RobG - сами образцы данных не соответствуют вашему правилу целочисленного кратного   -  person Amit    schedule 21.03.2016
comment
@RobG: нет, как я уже сказал, более длинный массив может быть от 1 элемента длиннее до любого вида умножения или сложения.   -  person thednp    schedule 21.03.2016
comment
@Amit - ОП не сказал, в чем логика, я просто догадался в надежде получить больше информации. Без этого любой ответ является предположением.   -  person RobG    schedule 21.03.2016
comment
@thednp - значит, любая случайная замена элементов более длинного массива допустима, если все элементы более короткого массива присутствуют, а длина не изменяется?   -  person RobG    schedule 21.03.2016
comment
Расположение ясно, когда количество элементов в длинном массиве является кратным количеству элементов в коротком массиве, но вы не объяснили, что должно произойти, если это не кратно, например, когда длинный массив только что еще 1 элемент. В последнем случае какой элемент длинного массива не будет заменен?   -  person trincot    schedule 21.03.2016
comment
Да, @RobG, другое дело, я хочу, чтобы замена происходила для более близких значений внутреннего массива. Я очень быстро обновлю вопрос.   -  person thednp    schedule 21.03.2016


Ответы (1)


Это довольно просто. Просто создайте копию более длинного массива, а затем перезапишите элементы этой копии элементами из более короткого массива.

var m = Math.floor(long.length/short.length);

var result = long.slice();
for(var i = 0; i < short.length; ++i) {
    result[i*m] = short[i];
}

Позднее редактирование: на самом деле это неправильно. Интересная проблема в этом вопросе - алгоритм интервалов, и вы не можете получить его с помощью этого конкретного простого умножения.

Я все равно оставлю этот ответ здесь, потому что он может помочь прояснить, в чем заключается эта проблема.

person Andrew Shepherd    schedule 20.03.2016
comment
Откуда ты вообще знаешь, чего хочет ОП? - person Amit; 21.03.2016
comment
Спасибо, дайте мне несколько минут, чтобы проверить это. Кстати, не могли бы вы сделать работающий пример? - person thednp; 21.03.2016
comment
@thednp - На самом деле мой ответ не работает. Проблема, кажется, заключается в том, чтобы разнести его, и мое простое умножение неверно. Я, пожалуй, удалю это. - person Andrew Shepherd; 21.03.2016
comment
Что ж, это хорошее начало, не волнуйтесь, я защищу вас от бэкдора :) - person thednp; 21.03.2016
comment
Если вы замените floor на ceil, это даст желаемый результат. - person georg; 21.03.2016
comment
Это действительно работает, как и ожидалось, это отвечает на мой вопрос, мы можем закрыть его здесь. - person thednp; 21.03.2016
comment
Я думаю, что это должно быть (long.length-1)/(short.length-1) - person Oriol; 21.03.2016