2012-02-07 8 views
15

Tengo una matriz que me gustaría dividir a la mitad. Así que puedo colocar la primera mitad en el lado derecho y la segunda mitad en el lado izquierdo.Empalme una matriz por la mitad, sin importar el tamaño?

he utilizado la función de empalme antes:

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

Pero no está seguro de cómo realizar una junta por la mitad, sin importar el tamaño, ya que el conjunto va a cambiar de tamaño dinámicamente.

+1

¿Cómo puede usted encontrar lo grande que desea que cada medio que sea? –

+2

-1 porque puedes determinar eso solo por pensarlo. ¿Cuál será el punto intermedio - el argumento para 'empalmar' - cuando el tamaño de la matriz sea' N'? ¿Y cómo determinas 'N'? –

+1

¿Qué pasa si hay un número impar? No hay 'Mitad' ... ¡solo digo! – Relic

Respuesta

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

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

editado el siguiente código @Lightness razas en el comentario de la órbita

+1

'Math.ceil (arrayName.length/2)' puede reemplazar siete y una tercera líneas de su código y evitar contaminar el alcance global para arrancar. –

14

Simplemente puede referirse a la longitud de la matriz:

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

Desde .splice() realidad elimina elementos de la matriz de origen, los elementos restantes de la matriz serán los elementos para la mitad derecha.

Math.floor() redondeará hacia abajo para dar al lado izquierdo uno menos que el lado derecho para longitudes impares. Puede usar Math.ceil() si desea redondear para dar al lado izquierdo uno más que el derecho cuando la longitud es impar.

0

si desea que el tamaño de la matriz para permanecer iguales sólo tiene que alternar qué matriz se escribe a (por ejemplo, alternas .push pide a las matrices) .. ¿Por qué no creas 2 matrices por adelantado?

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

Después de hacer eso, si desea mantener los 2 conjuntos de la misma alternativo tamaño entre

leftHalf.push(newElement); 

y

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

Por ejemplo:

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'] 

Más información:splice in the MDN docs


Tenga en cuenta que esto modifica su matriz original. Si desea conservar el conjunto original, clone el conjunto y luego utilice el empalme en el conjunto clonado. De una SO question acerca de las matrices de clonación:

Ha habido un hilo PUNTOS DE REFERENCIA huuuge, proporcionando siguiente información:

  • para navegadores de parpadeo slice() es el método más rápido, concat() es un poco más lento, y mientras que el bucle es 2.4 veces más lento.

  • para otros navegadores, mientras que el bucle es el método más rápido, ya que esos navegadores no tienen optimizaciones internas para slice y 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

Evitar Las mutaciones

Si es necesario evitar las mutaciones, por ejemplo, si usted tiene que dividir una matriz en la que reaccionan no quieren mutar el original o podría dar lugar a un comportamiento muy extraño en tu aplicación.

Uso rebanada

Usted puede evitar esto mediante el uso de slice en lugar de splice

Ejemplo

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

let arrayFirstHalf = yourArray.slice(0, halfWayThough); 
let arraySecondHalf = yourArray.slice(halfWayThough, yourArray.length); 
Cuestiones relacionadas