Tengo una matriz:

[1, 2, 3, 4, 5]

Y quiero inyectar algo (digamos 0) entre cada elemento de la matriz, así:

[1, 0, 2, 0, 3, 0, 4, 0, 5]

El elemento inyectado podría ser cualquier cosa: un número, una cadena, un elemento JSX, etc.

¿Hay alguna forma elegante de hacer esto?

-2
silvenon 10 dic. 2015 a las 14:04

4 respuestas

La mejor respuesta

Una forma ridícula de hacerlo. Simplemente me gusta reduce:

var arr = [1, 2, 3, 4, 5].reduce(function (p, c, i, a) {
  return i < a.length - 1 ? p.concat(c, 0) : p.concat(c);
}, []);

Si el elemento inyectado varía, simplemente envuelva el código en una función.

function stuffer(arr, el) {
  return arr.reduce(function (p, c, i, a) {
    return i < a.length - 1 ? p.concat(c, el) : p.concat(c);
  }, []);
}

stuffer(arr, '<p>Hi</p>');
2
Andy 10 dic. 2015 a las 15:49

Solo únete y divide

var arr = [1, 2, 3, 4, 5];
alert( arr.join(',0,').split(',') );

Se puede refactorizar en un método

function insertBetweenAllElements( arr, newElement )
{
   return arr.join(',' + newElement  + ',').split(',')
}
var updatedArr = insertBetweenAllElements( arr, '0' ) 
alert( updatedArr );

Agregar soporte para todo tipo de datos (int, str, etc.)

function insertBetweenAllElements( arr, newElement )
{
   arr.forEach( function( value, index, arr ){ arr.splice(index+index, 0, newElement ); } )
   return arr.slice(1,arr.length);
}
var updatedArr = insertBetweenAllElements( arr, '0' ) 
alert( updatedArr );
0
gurvinder372 10 dic. 2015 a las 11:26

No estoy seguro de que clasifique esto como elegante, pero funciona (y está en su lugar, no se dañaron ni se usaron matrices temporales en este código)

var array = [1,2,3,4,5];
function insertBetween(arr, val) {
    arr.map(function(e, i) { if (i) arr.splice(i * 2 - 1, 0, val) }); 
}
insertBetween(array, 0);
0
Jaromanda X 10 dic. 2015 a las 11:31

La forma más sensata es simplemente crear una nueva matriz:

var arr    = [1, 2, 3, 4, 5],
    newArr = [];
for (var i = 0; i < arr.length; i++) {
    newArr.push(arr[i], 0);
}

Una forma menos sensata implicaría utilizar mucho Array.splice.

2
deceze 10 dic. 2015 a las 11:06