2012-03-29 13 views
23
var arr = ['a', 'b', 'c', 'd', 'e', 'f']; 
var point = 'c'; 

¿Cómo puedo dividir el "Arr" en dos matrices basado en el "punto" variables, como:array dividido en dos matrices

['a', 'b'] 

y

['d', 'e', 'f'] 
+0

así lo hice con dos iteraciones y un par de variables temporales, pero yo tenía la esperanza de que hay una manera más rápida y con menos código ... – ellabeauty

+0

siempre será compuesto por las matrices de cadenas de caracteres individuales? – paislee

+0

Te sugiero que escribas una función que divide una matriz en función de la variable "punto". –

Respuesta

28
var arr2 = ['a', 'b', 'c', 'd', 'e', 'f']; 
arr = arr2.splice(0, arr2.indexOf('c')); 

Para eliminar 'c' de arr2:

arr2.splice(0,1); 

arr contiene los primeros dos elementos y arr2 contiene los tres últimos.

Esto hace algunas suposiciones (como arr2 siempre contendrá el 'punto' en la primera asignación), por lo tanto, agregue alguna corrección para casos de frontera según sea necesario.

+0

En realidad eso debería ser 'arr2.indexOf ('c') + 1'. – Jon

+0

Solucionado ... para este caso específico, al menos. – ramblinjan

10

Uso indexOf y slice

http://jsfiddle.net/mendesjuan/8VtBk/

var indexToSplit = arr.indexOf(point); 
var first = arr.slice(0, indexToSplit); 
var second = arr.slice(indexToSplit + 1); 

indexOf no está disponible en todos los navegadores, pero el enlace anterior tiene algo que puede utilizarse en lugar puede utilizar un fragmento como el siguiente

if (!Array.indexOf) { 
    Array.prototype.indexOf = function (obj, start) { 
    for (var i = (start || 0); i < this.length; i++) { 
     if (this[i] == obj) { 
     return i; 
     } 
    } 
    return -1; 
    } 
} 
4

Pruebe este:

var arr = ['a', 'b', 'c', 'd', 'e', 'f']; 
var point = 'c'; 

var idx = arr.indexOf(point); 

arr.slice(0, idx) // ["a", "b"] 
arr.slice(idx + 1) // ["d", "e", "f"] 
0

Otra sugerencia:

var segments = arr.join('').split(point).map(function(part) { 
    return part.split(''); 
}); 

ahora segments contiene una matriz de matrices:

[["a", "b"], ["d", "e", "f"]] 

y puede conseguir acceder a ella como

segments[ 0 ]; // ["a", "b"] 
segments[ 1 ]; // ["d", "e", "f"] 
+3

Esto fallará si la matriz contiene algo como 'abc' –

+0

@JuanMendes: en realidad no. ¿Por qué piensas eso? – jAndy

+0

http://jsfiddle.net/mendesjuan/vjZsB/ –

1
var arr = ['a', 'b', 'c', 'd', 'e', 'f']; 
var point = 'c'; 
var i = arr.indexOf(point); 
var firstHalf, secondHalf, end, start; 

if (i>0) { 
    firstHalf = arr.slice(0, i); 
    secondHalf = arr.slice(i + 1, arr.length);  
} 

// esto debería comenzar. ¿Puedes pensar en qué casos extremos debes probar para solucionarlos? // ¿Qué sucede cuando el punto está al principio o al final de la matriz?

2
var arr = ['a', 'b', 'c', 'd', 'e', 'f']; 
var point = 'c'; 
Array.prototype.exists = function(search){ 
    for (var i=0; i<this.length; i++) { 
     if (this[i] == search) return i; 
    } 
    return false; 
} 

if(i=arr.exists(point)) 
{ 
    var neewArr=arr.splice(i); 
    neewArr.shift(0); 

    console.log(arr); // output: ["a", "b"] 
    console.log(neewArr); // output: ["d", "e", "f"] 
}​ 

Aquí hay un example.

+1

Su función 'exists' ya existe, se llama' indexOf'. –

1

Al dividir la matriz, querrá crear dos nuevas matrices que incluirán lo que está dividiendo, por ejemplo, arr1 y arr2. Para poblar estas matrices, tendrá que hacer algo como esto:

var arr1, arr2; // new arrays 
int position = 0; // start position of second array 
    for(int i = 0; i <= arr.length(); i++){ 
     if(arr[i] = point){ //when it finds the variable it stops adding to first array 
      //starts adding to second array 
      for(int j = i+1; j <= arr.length; j++){ 
       arr2[position] = arr[j]; 
       position++; //because we want to add from beginning of array i used this variable 
      } 
     break; 
     } 
     // add to first array 
     else{ 
      arr1[i] = arr[i]; 
     } 
} 

¡Hay diferentes formas de hacerlo! ¡buena suerte!

3

Compartiendo esta función de conveniencia que terminé haciendo después de visitar esta página.

function chunkArray(arr,n){ 
    var chunkLength = Math.max(arr.length/n ,1); 
    var chunks = []; 
    for (var i = 0; i < n; i++) { 
     if(chunkLength*(i+1)<=arr.length)chunks.push(arr.slice(chunkLength*i, chunkLength*(i+1))); 
    } 
    return chunks; 
} 

Ejemplo de uso:

chunkArray([1,2,3,4,5,6],2); 
//returns [[1,2,3],[4,5,6]] 

chunkArray([1,2,3,4,5,6,7],2); 
//returns [[1,2,3],[4,5,6,7]] 

chunkArray([1,2,3,4,5,6],3); 
//returns [[1,2],[3,4],[5,6]] 

chunkArray([1,2,3,4,5,6,7,8],3); 
//returns [[1,2],[3,4,5],[6,7,8]] 

chunkArray([1,2,3,4,5,6,7,8],42);//over chunk 
//returns [[1],[2],[3],[4],[5],[6],[7],[8]]