Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

filter e some

um filter me retorna um novo array de acordo com meu filtro correto? um some me retorna verdadeiro ou falso caso se encontre um elemento de acordo com o filtro tbm

let service = new NegociacaoService();
        service
            .obterNegociacoes()
            .then(negociacoes => negociacoes.filter(negociacao => {
               return !this._listaNegociacoes.negociacoes.some(negociacaoExistene => JSON.stringify(negociacaoExistene)== JSON.stringify(negociacao))

            }))
            .then(negociacao => negociacao.forEach(nego=>this._listaNegociacoes.adiciona(nego))   );                              
    }

nao faria mais sentido se fosse um filter ? eu sei que ele nao funciona nesse caso. mas se o some so me devolve um bool ,como que no proximo then possui o array com os diferentes no proximo then, e pq o filter nao funciona nesse caso?

4 respostas

Olá Luan, tudo bem com você?

Você diz em substituir o:

this._listaNegociacoes.negociacoes.some

Por um outro filter?

Neste caso não, porque quando utilizamos o filter passamos um filtro que para cada elemento irá aplicar o teste e devolver um valor booleano para saber se esse elemento estará presente ou não no array de resultados :)

Se trocássemos por um filter, na verdade iriamos retornar ou um array vazio, ou com elementos, e não é isso que queremos, o objetivo é ter um valor true ou false

E isso emenda a resposta da sua pergunta:

,como que no proximo then possui o array com os diferentes

Vamos supor que temos:

listaDeNegociacoes = [ "Negociacao:1", "Negociacao:2", "Negociacao:3"]

negociacoes = ["Negociacao:5", "Negociacao:2", "Negociacao:1"]
`

E ai fariamos:

negociacoes.filter( negociacao => { 
    return ! ( listaDeNegociacoes.some( negocio => negocio === negociacao))
})

Então teriamos na primeira iteração:

negociacao = "Negociacao:5"

Resultado do Some = Iriamos ver que o valor não está presente na lista e devolveriamos false, entretanto temos o ! no começo, portanto true

Quando o teste lógico do filter da true ele é adicionado no array de resultado, então:

Resultado do Filter: [ "Negociacao:5"]

---------------------------------------------------------------------------

Segunda iteração:

negociacao = "Negociacao:2"

Resultado do Some = Temos esse valor na lista, então o retorno do some é true, entretanto com o ! vai para false

Como deu false ele não é adicionado no resultado do filter

---------------------------------------------------------------------------

Última iteração:

negociacao = "Negociacao:1"

Resultado do Some = Iriamos ver que o valor não está presente na lista, com a negação do ! iria para true, então adicionamos também na lista:

Resultado do Filter: [ "Negociacao:5", "Negociacao:1"]

---------------------------------------------------------------------------

Então o array do próximo do then é o resultado do filter e não a resposta do teste lógico do some, esse será utilizada pelo filter para definir se o elemento estará presente ou não no array de resultados

Conseguiu compreender?

Abraços e Bons Estudos!

var nome1 = ['n1'];
var nome2 =[ 'n5','n4','n3'];

var teste = (nome1[0] != nome2[0]);

// console.log(teste);
var nome

nome1.filter(n1=>{

    var n =  nome2.some(n2=>{
            n1!=n2;
        })

        console.log(n);
        if(n)
        {
            console.log(n1);
        }

    })

fiz esse teste aqui, mas nao entendi pq ao testar diferente foi me retornado false, pq isso?

solução!

Então Luan,

A questão aqui é que você está utilizando arrow functions com blocos e não está retornando valor nenhum:

Por exemplo:

var soma = (numero1, numero2) => {
    numero1+ numero2;
}

var resultado = soma(5, 5)
console.log(resultado);

>> undefined

Por que o resultado não foi 10? Porque eu não coloquei o return, então a função não devolve nada, apenas executou o código

var soma = (numero1, numero2) => {
    return numero1+ numero2;
}

var resultado = soma(5, 5);
console.log(resultado);

>> 10

Dessa maneira teremos o valor 10, então a regra é a seguinte:

  • Ou utilizamos arrow function em uma linha e ai o return é implicito

Ex:

var resultado = (numero1, numero2) => numero1 + numero2;

  • Caso a gente abra o bloco precisamos utilizar o return :)

Mudando seu código adicionando o return:

nome1.filter(n1=>{

    var n =  nome2.some(n2=>{
            return n1!=n2;
        })

        console.log(n);
        if(n)
        {
            console.log(n1);
        }

            return n

    })

Teremos o resultado que você espera :)

Abraços e Bons Estudos!

puts que falta de atençao cara rsrrs, falta de costume . brigado ae cara

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software