2015-10-23 16 views
8

Che cosa è il modo più semplice (con javascript "nativo") per duplicare ogni elemento in un array JavaScript?Come duplicare elementi in un array js?

L'ordine conta.

Ad esempio:

a = [2, 3, 1, 4] 
// do something with a 
a 
// a is now [2, 2, 3, 3, 1, 1, 4, 4] 
+0

Non consigliato/consigliato/affidabile ma è possibile utilizzare anche espressioni regolari. ... 'A = a.join (' ') sostituire (/ (\ d +)/g, "$ 1, $ 1") split (',') map (Number);' – Tushar

+0

@Tushar Nizza idea. Tuttavia, come si già assunto, sto cercando una soluzione generica che funziona anche con array di stringhe che potrebbe anche contenere le virgole ... –

+0

** Le risposte migliori a questa domanda sembrano essere giochi di complessità del codice di golf **. Non usare ridurre, l'intento è super poco chiaro. A volte un ciclo for è la risposta corretta ragazzi, mi dispiace. –

risposta

5

mi si avvicinò con qualcosa di simile a tymeJV 's risposta

[2, 3, 1, 4].reduce(function (res, current, index, array) { 
    return res.concat([current, current]); 
}, []); 
+1

Ah mi ha battuto, questo è quello che posso prendere il caffè prima di scrivere il risposta! +1 – epascarello

+2

Haha :) il caffè è una buona ragione per non ottenere i biscotti! – axelduch

+0

Non capisco perché siano necessari gli ultimi due parametri ('index',' array') se non li vedo usati. Qualcuno può spiegare questo per favore? – MarksCode

5

Suppongo che si possa fare:

var duplicated = a.map(function(item) { 
    return [item, item]; 
}).reduce(function(a, b) { return a.concat(b) }); 

//duplicated: [2, 2, 3, 3, 1, 1, 4, 4] 
+1

Non è 'Mappa' ES6? In tal caso potrebbero esserci problemi di compatibilità con questa soluzione. –

+0

map + reduce + concat sembra eccessivo. Riduci meglio. – James

+1

@EricHerlitz - '.map' è ES5. – tymeJV

1

In sostanza:

a = [2, 3, 1, 4]; 
b=[]; 

for(var i = 0; i< a.length;++i){ 
    b.push(a[i]); 
    b.push(a[i]); 
} 

a=b; 
+1

Questa è l'unica risposta che non mi ha reso WTF. È noioso, ma l'intento è chiaro. –

1

Basta Splice un po '.

var a = [2, 3, 1, 4], 
 
    i = a.length; 
 
while (i--) { 
 
    a.splice(i, 0, a[i]); 
 
} 
 
document.write('<pre>' + JSON.stringify(a, 0, 4) + '</pre>');

1

mi sono imbattuto in questo problema nella mia domanda, così ho creato questa funzione:

function duplicateElements(array, times) { 
    return array.reduce((res, current) => { 
     return res.concat(Array(times).fill(current)); 
    }, []); 
} 

Per utilizzarlo, semplice passare la matrice e il numero di volte che si vogliono gli elementi da duplicare:

duplicateElements([2, 3, 1, 4], 2); 
0

Questi f Unzioni può aiutare a vedere .sort(), .concat()

function duplicate(arr) { 
    return arr.concat(arr).sort() 
} 
console.log(duplicate([1,2,3,4,5])) 
+0

in discussione la sua chiaramente menzionati ** Le questioni di ordine. ** – Durga

+0

grazie @Davut .. aggiungendo sort() risolverebbe questo – tallgirltaadaa

Problemi correlati