Sto lavorando a un piccolo esercizio: Il problema è che voglio questo:
=> ["kept","kept"]
Ma invece, Continuo a ricevere questo:
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 № 1Quando 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.