Как уже упоминалось здесь несколько раз, самый простой способ сделать это
function intercalate(glue, arr){
return arr.reduce((acc, v) => acc.concat(glue, v));
}
, но это не самый лучший способ, так как он создает с каждой итерации новый (промежуточный) массив, который затем отбрасывается. Это не имеет значения для этого небольшого массива значений, но если вы когда-либо собираетесь использовать его на более длинном массиве, вы можете заметить влияние.
Лучше бы создать один массив и нажмите значение в том, что, как они приходят в.
function intercalate(glue, arr){
const push = (acc, v) => (Array.isArray(v)? acc.push(...v): acc.push(v), acc);
return arr.reduce((acc, v, i) => push(i===0? acc: push(acc, glue), v), []);
}
Но так как этот массив постепенно увеличивая его, возможно, нужно выделить больший кусок памяти и копирование данные. Эти задачи очень эффективны, но все же не нужны (imo); мы можем сделать лучше.
Сначала создадим список, содержащий все массивы и разделитель между ними, и сгладьте это, используя concat.apply([], list)
. Поэтому мы создаем один промежуточный массив, размер которого мы можем вычислить загодя, а остальная часть - проблема Array.concat, и это базовая реализация.
function intersperse(delimiter, arr){
if(!arr.length) return [];
let j = 0, push = (acc, v) => (acc[j++] = v, acc);
return arr.reduce((acc, v) => push(j===0? acc: push(delimiter, glue), v), Array(2*arr.length-1));
}
//or
function intersperse(delimiter, arr){
if(!arr.length) return [];
var out = Array(2*arr.length-1);
out[0] = arr[0];
for(var i=1, j=1; j<out.length;){
out[j++] = delimiter;
out[j++] = arr[i++];
}
return out;
}
//and
function intercalate(glue, arr){
var emptyArray = [];
return arr.length?
emptyArray.concat.apply(emptyArray, intersperse(glue, arr)):
emptyArray;
}
Wich версия будет лучшим/быстрым, в конце концов, не так легко сказать, так как это может зависеть от переданных значений, а кастрированный баран или не JIT компилятор оптимизирует S *** из из этого. Я сделал свои замечания, вам решать, какую версию/реализацию вы используете.
Для первой версии: вы можете предпочесть не ставить это в Lib вообще, но писать это в основном рядный (это коротко и просто достаточно для этого), поэтому JIT-компилятор не может попытаться найти некоторые общие типы между различными вызовами (#monomorphic function/code) и, следовательно, оптимизировать каждое возникновение отдельно. С другой стороны, это может быть преждевременная оптимизация. Тебе решать.
добавьте еще несколько примеров. –
Функциональное имя для того, чтобы вы хотели [interperse] (http://hackage.haskell.org/package/base-4.9.0.0/docs/Data-List.html#v:intersperse) массив с другим элементом. В настоящее время это [функция-запрос] (https://github.com/lodash/lodash/issues/2339) для Lodash, поэтому перейдите на него, если хотите, чтобы он был добавлен в библиотеку! – 4castle
@ 4castle О, круто. Может быть, я отправлю запрос на тяну. Спасибо!! – GregRos