2011-08-30 22 views
13
var arr = [4, 5, 7, 8, 14, 45, 76]; 

function even(a) { 
    var ar = []; 

    for (var i = 0; i < a.length; i++) { 
    ar.push(a[2 * i + 1]); 
    } 

    return ar; 
} 

alert(even(arr)); 

http://jsbin.com/unocar/2/edit¿Cómo extraigo elementos uniformes de una matriz?

I han tratado de este código con el fin de incluso (índice) elementos de salida de una matriz. Funciona, pero también genera algunos elementos vacíos. ¿Cómo arreglo este código para generar solo elementos existentes?

Respuesta

14

De cualquier uso módulo:

for (var i = 0; i < a.length; i++) { 
    if(i % 2 === 0) { // index is even 
     ar.push(a[i]); 
    } 
} 

o saltar cada segundo elemento mediante el incremento de i en consecuencia:

for(var i = 0; i < a.length; i += 2) { // take every second element 
    ar.push(a[i]); 
} 

Aviso: Su código realmente tiene los elementos con impares índices de la matriz . Si esto es lo que desea, debe usar i % 2 === 1 o iniciar el ciclo con var i = 1 respectivamente.

+0

probablemente, lo dije incorrectamente. quise decir número ordinal de elementos, por ejemplo, 5 es el segundo, 8 es el cuarto ... y así sucesivamente ... – DrStrangeLove

+0

Veo ... entonces debería funcionar si toma los índices impares. –

+0

para comenzar desde el segundo elemento: para (var i = 1; – DruDro

2

¿Por qué no pruebas con el operador%. Te da lo que queda de una división.

reemplazar el bloque de bucle con

if ((i % 2) === 0) { 
    ar.push(a[i]) 
} 
0

Es necesario para poner a prueba los elementos para la uniformidad de esta manera:

var arr = [4,5,7,8,14,45,76]; 

function even(a){ 
    var ar = []; 

    for (var i=0; i<a.length;i++){ 
    if (a[i] % 2 === 0) 
    { 
     ar.push(a[i]); 
    } 

    } 

return ar; 
} 

alert(even(arr)); 

% 2 es el operador de módulo, devuelve el resto de la división entera.

+0

respondió la pregunta incorrecta, lo siento sobre eso – jkebinger

0
var arr = [4,5,7,8,14,45,76]; 

function even(a) 
{ 
    var ar = []; 

    for (x in a) 
    { 

    if((a[x]%2)==0) 
    ar.push(a[x]); 

    } 
return ar; 
} 

alert(even(arr)); 
+1

Se desaconseja iterar sobre una matriz con 'for ... in'. Ver https: // developer. mozilla.org/es/JavaScript/Reference/Statements/for...in –

+0

@Felix Kling: lo siento ... no estaba al tanto de eso ... :) gracias por el enlace – mithunsatheesh

+0

No hay problema y eres bienvenido :) –

9

Para IE9 + usar Array.filter

var arr = [4,5,7,8,14,45,76]; 
var filtered = arr.filter(function(element, index, array) { 
    return (index % 2 === 0); 
}); 

Con una reserva para IE mayores, todos los otros navegadores están bien sin este repliegue

if (!Array.prototype.filter) 
{ 
    Array.prototype.filter = function(fun /*, thisp */) 
    { 
    "use strict"; 

    if (this === void 0 || this === null) 
     throw new TypeError(); 

    var t = Object(this); 
    var len = t.length >>> 0; 
    if (typeof fun !== "function") 
     throw new TypeError(); 

    var res = []; 
    var thisp = arguments[1]; 
    for (var i = 0; i < len; i++) 
    { 
     if (i in t) 
     { 
     var val = t[i]; // in case fun mutates this 
     if (fun.call(thisp, val, i, t)) 
      res.push(val); 
     } 
    } 

    return res; 
    }; 
} 
0

solo quería explicar por qué su resultado es no es lo que esperabas, ya que todos los demás muestran excelentes soluciones. Está iterando sobre un tamaño de matriz N, por lo que su matriz resultante intentará insertar elementos en una matriz que dará como resultado el tamaño N. Dado que solo se encontrará N/2 en la matriz original, la matriz resultante rellenará el resto con espacios en blanco para rellenar en el resto de N. Entonces, si verificó si existe [2 * i] O verificó si [i]% 2 == 0 antes de insertar, la matriz resultante solo contendrá los valores indexados pares

3

Se agrega eltuza respuesta:

[1,2,3,4,5].filter(function(num){ if(num % 2) return num;}) 
+0

This la respuesta no responde exactamente la pregunta. – A1rPun

Cuestiones relacionadas