/ / Perché l'ultimo elemento del mio array ritorna indefinito, invece di staccarlo? [duplicato] - javascript

Perché l'ultimo elemento del mio array non viene definito indefinito, piuttosto che splicing? [duplicato] - javascript

Sto lavorando a un piccolo esercizio: Il problema è che voglio questo:

=> ["kept","kept"]

Ma invece, Continuo a ricevere questo:

inserisci la descrizione dell'immagine qui

function keep(array, keeper) {

//This will return an array of undefined"s and "kept"s
// =>[ "kept", undefined, "kept", undefined, undefined ]

matchingNumbers = array.map(function matching(element){
if (element === keeper) {
return element;
}
});


//Eliminate all undefined"s from the matchingNumbers array

matchingLength = matchingNumbers.length;
for (var i = 1; i < matchingLength; i++) {
if(matchingNumbers[i] === undefined) {
(matchingNumbers.splice(i, 1));
}
}
return matchingNumbers;
}

keep(["kept", "thirty", "kept", 2, 1], "kept")

Sto cercando di separare tutti gli indefiniti in matchingNumber con il for-loop, quindi perché c'è un ultimo indefinito rimasto?

risposte:

4 per risposta № 1

Quando una funzione non esegue a return dichiarazione, restituisce undefined per impostazione predefinita. array.map() mette i valori di ritorno della funzione nella matrice risultante e questo include quelli undefined valori.

Dovresti usare array.filter invece di array.map:

matchingNumbers = array.filter(function matching(element){
return element === keeper;
});

2 per risposta № 2

La mia ipotesi è perché stai iniziando i a 1 invece di 0. Inoltre, come accennato da @Wali, stai cambiando la lunghezza dell'array durante l'iterazione su di esso. Per risolverlo, passa attraverso l'array in ordine inverso:

for (var i = array.length; i > 0; i--) {
...
}

Come nota a margine, è possibile ottenere ciò che si desidera utilizzare Array.filter piuttosto che occuparsi di mappatura e giunzione.