Quero comparar cada string em um Array com uma determinada string. Minha implementação atual é:
function startsWith(element) {
return element.indexOf(wordToCompare) === 0;
}
addressBook.filter(startsWith);
Essa função simples funciona, mas apenas porque agora wordToCompare está sendo definida como uma variável global, mas é claro que quero evitar isso e passá-lo como um parâmetro. Meu problema é que não tenho certeza de como definir startsWith (), então ele aceita um parâmetro extra, porque eu realmente não entendo como os parâmetros padrão que ele usa são passados. Eu tentei todas as maneiras diferentes que posso pensar e nenhuma delas funcionou.
Se você também pudesse explicar como funcionam os parâmetros passados para funções de retorno de chamada 'integradas' (desculpe, não conheço um termo melhor para isso), seria ótimo
fonte
O segundo parâmetro do filtro definirá isso dentro do retorno de chamada.
Então você pode fazer algo como:
fonte
{one: 'haha', two:'hoho'}
Para aqueles que procuram uma alternativa ES6 usando funções de seta, você pode fazer o seguinte.
A versão atualizada usando inclui :
fonte
fonte
Você pode usar a função de seta dentro de um filtro, como este:
Funções de seta no MDN
fonte
Para quem está se perguntando por que sua função de seta gorda está ignorando
[, thisArg]
, por exemplo, por que["DOG", "CAT", "DOG"].filter(animal => animal === this, "DOG")
retorna[]
é porque
this
dentro dessas setas as funções são vinculadas quando a função é criada e são configuradas com o valor dethis
no escopo abrangente mais amplo, então othisArg
argumento é ignorado. Eu contornei isso facilmente declarando uma nova variável em um escopo pai:let bestPet = "DOG"; ["DOG", "CAT", "DOG"].filter(animal => animal === bestPet); => ["DOG", "DOG"]
Aqui está um link para mais algumas leituras: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions#No_separate_this
fonte
com base na resposta oddRaven e https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter
eu fiz isso de 2 maneiras diferentes. 1) usando a maneira de função. 2) usando a maneira inline.
fonte
Existe uma maneira fácil de usar a função de filtro, acessar todos os parâmetros e não complicar demais.
A menos que thisArg do retorno de chamada seja definido para outro escopo, o filtro não cria seu próprio escopo e podemos acessar parâmetros dentro do escopo atual. Podemos definir 'this' para definir um escopo diferente para acessar outros valores, se necessário, mas por padrão é definido para o escopo de onde é chamado. Você pode ver isso sendo usado para escopos angulares nesta pilha .
Usar indexOf está anulando o propósito do filtro e adicionando mais overhead. O filtro já está passando pelo array, então por que precisamos iterar por ele novamente? Em vez disso, podemos torná-la uma função pura e simples .
Aqui está um cenário de caso de uso dentro de um método da classe React em que o estado tem uma matriz chamada itens e, usando o filtro, podemos verificar o estado existente:
fonte