2012-02-07 16 views
15

Ho una matrice che vorrei dividere a metà. Quindi posso posizionare la prima metà sul lato destro e la seconda metà sul lato sinistro.Unisci un array a metà, indipendentemente dalle dimensioni?

Ho usato la funzione di giunzione prima:

var leftSide = arrayName.splice(0,2); 

ma non sapete come impiombare a metà non importa la dimensione, perché la matrice cambierà in termini di dimensioni in modo dinamico.

+1

Come potrebbe trovare quanto grande si desidera che ogni mezzo di essere? –

+2

-1 perché è possibile determinarlo solo a pensarci. Quale sarà il punto a metà strada - l'argomento di 'splice' - essere quando la dimensione dell'array è' N'? E come si determina 'N'? –

+1

cosa succede se c'è un numero dispari? Non c'è un "mezzo" ... basta dire! – Relic

risposta

35
var half_length = Math.ceil(arrayName.length/2);  

var leftSide = arrayName.splice(0,half_length); 

modificato il seguente codice @Lightness gare in commento Orbit

+1

'Math.ceil (arrayName.length/2)' può sostituire sette e una terza riga del codice ed evitare di contaminare l'ambito globale per l'avvio. –

14

Si può semplicemente fare riferimento alla lunghezza dell'array:

var leftSide = arrayName.splice(0, Math.floor(arrayName.length/2)); 

Dal .splice() effettivamente rimuove gli elementi dalla matrice di origine, gli elementi restanti nella matrice saranno gli elementi per la metà di destra.

Math.floor() arrotonderà per dare al lato sinistro uno in meno rispetto al lato destro per lunghezze dispari. Potresti usare Math.ceil() se vuoi arrotondare per dare al lato sinistro uno più del lato destro quando la lunghezza è dispari.

0

se si desidera che la dimensione della matrice di rimanere uguale è sufficiente alternare cui gamma si scrive a (ad esempio, si alternano .push invita gli array) .. Perché non creare solo 2 array in primo piano?

var lelftHalf = yourArray.splice(0,arrayName.length/2); 

Dopo averlo fatto, se si desidera mantenere le 2 matrici delle stesse dimensioni si alternano tra

leftHalf.push(newElement); 

e

yourArray.push(newElement1); 
1
let leftSide = myArray.splice(0, Math.ceil(myArray.length/2)); 
//The right side is stored in "myArray" 

Ad esempio:

let letters = ['a', 'b', 'c', 'd', 'e']; 
let leftSide = letters.splice(0, Math.ceil(letters.length /2)); 
let rightSide = letters; 
console.log(leftSide); 
=> ['a', 'b', 'c'] 
console.log(rightSide); 
=> ['d', 'e'] 
012.

Maggiori informazioni:splice in the MDN docs


Si noti che questa modifica l'array originale. Se si desidera mantenere la matrice originale, clonare la matrice, quindi utilizzare la giunzione sulla matrice clonata. Dal SO question sugli array clonazione:

C'è stato un filo RIFERIMENTO huuuge, fornendo informazioni seguenti:

  • per browser lampeggio slice() è il metodo più veloce, concat() è un po 'più lento, mentre il ciclo è più lento di 2.4 volte.

  • per altri browser mentre il ciclo è il metodo più veloce, poiché tali browser non dispongono di ottimizzazioni interne per slice e concat.

//Fastest for Blink browsers (Opera/Chromium): 
let clonedArray = originalArray.slice(); 
//For other browsers: 
let clonedArray = []; 
var i = myArray.length; 
while (i--) clonedArray[i] = myArray[i]; 
3

Evitare mutazioni

Se è necessario evitare mutazioni, ad esempio se si deve dividere una matrice in te reagire non vogliono mutare l'originale o che potrebbe portare a un comportamento molto strano nella tua app.

Usa Fetta

Si può ovviare a questo utilizzando slice invece di splice

Esempio

let yourArray = props.someArray; 
let halfWayThough = Math.floor(yourArray.length/2) 

let arrayFirstHalf = yourArray.slice(0, halfWayThough); 
let arraySecondHalf = yourArray.slice(halfWayThough, yourArray.length); 
Problemi correlati