2011-08-30 12 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/editCome estrarre anche elementi di una matrice?

Ho provato questo codice per uscita anche elementi (indice) di una matrice. Funziona, ma restituisce anche alcuni elementi vuoti. Come posso risolvere questo codice per produrre solo elementi esistenti?

risposta

14

O uso modulo:

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

o saltare ogni secondo elemento incrementando i conseguenza:

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

Avviso: Il codice prende effettivamente gli elementi con dispari indici dall'array . Se questo è quello che vuoi, devi usare i % 2 === 1 o avviare il ciclo rispettivamente con var i = 1.

+0

probabilmente, l'ho detto in modo errato. Intendevo il numero ordinale di elementi, ad esempio 5 è il secondo, 8 il quarto .. e così via. – DrStrangeLove

+0

Vedo ... quindi dovrebbe funzionare se si prendono gli indici dispari. –

+0

per iniziare dal secondo elemento: per (var i = 1; – DruDro

2

perché non provare con l'operatore%. Ti dà il resto di una divisione.

sostituire il blocco del ciclo con

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

È necessario testare gli elementi di planarità simili:

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 è l'operatore modulo, restituisce il resto della divisione intera.

+0

ha risposto alla domanda sbagliata, mi dispiace per quello – 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

È scoraggiato per scorrere su un array utilizzando 'for ... in'. Vedere https: // developer. mozilla.org/en/JavaScript/Reference/Statements/for...in –

+0

@Felix Kling: mi dispiace .. non ero a conoscenza di questo .. :) grazie per il link – mithunsatheesh

+0

Nessun problema e prego :) –

9

Per IE9 + utilizzare Array.filter

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

Con un ripiego per IE più anziani, tutti gli altri browser sono OK senza questo ripiego

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

Volevo solo spiegare perché il vostro risultato è non è quello che ti aspettavi dato che tutti gli altri mostrano soluzioni eccellenti. Si sta iterando su una dimensione di matrice N in modo che la matrice risultante proverà a spingere elementi in una matrice che risulterà nella dimensione N. Poiché solo N/2 sarà trovato nell'array originale, la matrice risultante riempirà il resto con spazi vuoti da riempire nel resto di N. Quindi, se hai verificato se esiste [2 * i] O controllato per vedere se [i]% 2 == 0 prima di inserirlo, l'array risultante conterrà solo i valori di indice pari

3

Aggiungerà la risposta eltuza:

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

Questo la risposta non risponde esattamente alla domanda. – A1rPun

Problemi correlati