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

Quero entender melhor o código envolvendo filter e some

Estou com dificuldade de entender o passo a passo do código abaixo. Algum professor poderia destrinchá-lo para mim:

.then(negociacoesParaImportar => {

            const negociacoesJaImportadas = this._negociacoes.paraArray();

            negociacoesParaImportar
                .filter(negociacao => 
                    !negociacoesJaImportadas.some(jaImportada => 
                        negociacao.ehIgual(jaImportada)))
                .forEach(negociacao => 
                this._negociacoes.adiciona(negociacao));

2 respostas
solução!

Olá Mauricio, tudo bem?

Para fazer isso eu vou apenas utilizar um exemplo com os dados já fixos, ao invés de ser buscado em funções, ok?

Então nossos dados serão:

Equivale ao negociacoesJaImportadas

const listaDeNegociacoes = [
    { id: 1, nome: "Negociacao1"},
    { id: 2, nome: "Negociacao2"},
    { id: 3, nome: "Negociacao3"},
    { id: 4, nome: "Negociacao4"},
    { id: 5, nome: "Negociacao5"},
]

Equivale ao Negociacoes Para Importar
const negociacoesImportadas = [
    { id: 7, nome: "Negociacao7"},
    { id: 2, nome: "Negociacao2"},
    { id: 9, nome: "Negociacao9"},
    { id: 3, nome: "Negociacao3"},
]

Então no caso o que queremos é filtrar as negociações diferentes, no caso a de número 7 e 9.

O código será igual o da aula, portanto:

negociacoesImportadas.filter( negociacao => {
    return !listaDeNegociacoes.some( negociacaoNaLista => negociacaoNaLista.id === negociacao.id)
})

A única diferença é que o ehIgual no meu caso é a comparação entre id

Vamos por partes:

  1. O filter recebe uma função que tem o retorno booleano, de forma que ele vai pegar todos os elementos que deram true

O some vai ser essa função, o que ele faz é verificar se em uma lista existe um elemento que estamos buscando, então por exemplo na primeira execução:

negociacoesImportadas.filter( negociacao =>`

Essa nossa variável negociação equivale:

    { id: 7, nome: "Negociacao7"},

Dentro do some o que vamos fazer é comparar cada elemento da nossa lista de negociações com a atual:

1 != 7
2 != 7
....
5 != 7

Bem, percorremos todas e não há nenhuma igual, portanto a resposta do some é falso, isto é: Em nossa lista de negociações não há nenhuma parecida com essa

E aqui vem a utilização do !, veja que eu disse que o filter recebe uma função que devolve um valor booleano, como esse valor foi false, portanto não iremos colocar na nossa lista, para reverter isso negamos a resposta do some para termos true

Então o filter recebe true e armazena no array de resposta a negociação de número 7

Na segunda execução do filter teremos:

    { id: 2, nome: "Negociacao2"},

Dentro do some, teremos o mesmo processo:

1 != 2
2 == 2

Bem, encontramos um elemento, então o resultado do some vai ser true, com a negação mudamos para false e como vimos, não será armazenado no array final

Após todas iterações teremos um array apenas com as negociações não incluída:

{ id: 7, nome: "Negociacao7"},
{ id: 9, nome: "Negociacao9"},

Depois temos apenas o forEach para adicionar na lista de negociações essas novas:

.forEach(negociacao => 
                this._negociacoes.adiciona(negociacao));

No meu exemplo equivaleria a:

.forEach( negociacaoNaoAdicionada => listaDeNegociacoes.push(negociacaoNaoAdicionada))

Conseguiu Compreender dessa forma?

Abraços e Bons Estudos!

Acho que entendi tudo agora.

Obrigado.