indexOf does not find element in an array

5

The indexOf() is returning -1 even though I have this element, I'm doing this:

pessoas = [];
pessoas.push({"nome": "Pedro"})
pessoas.push({"nome": "João"})
pessoas.push({"nome": "Maria"})
pessoas.push({"nome": "José"})

console.log(pessoas)

function encontrar() {

if(pessoas.indexOf('Pedro') < 0) {
    console.log('Não existe');
  }else {
  console.log('Já existe');
  }

}

encontrar()
  

I tried the following way and it gives error:

pessoas = [];
pessoas.push({"nome": "Pedro"})
pessoas.push({"nome": "João"})
pessoas.push({"nome": "Maria"})
pessoas.push({"nome": "José"})

console.log(pessoas)

function encontrar() {

if(pessoas.nome.indexOf('Pedro') < 0) {
    console.log('Não existe');
  }else {
  console.log('Já existe');
  }

}

encontrar()
    
asked by anonymous 30.10.2018 / 20:11

5 answers

5

To find objects within an array, use findIndex , like this:

pessoas = [];
pessoas.push({"nome": "Pedro"})
pessoas.push({"nome": "João"})
pessoas.push({"nome": "Maria"})
pessoas.push({"nome": "José"})

console.log(pessoas)

function encontrar() {

if(pessoas.findIndex(x => x.nome === 'Pedro') < 0) {
    console.log('Não existe');
  }else {
    console.log('Já existe');
  }

}

encontrar()

Why does not it work with objects?

Initially, you made the comparison in the wrong way. If it were to compare, it would have to compare with the object within the index, in this case, pessoas.indexOf({nome: "Pedro"}); however, this also will not work. This is because, for javascript, each object is unique, even if its value is identical. A test? See:

var a = {} // objeto vazio
var b = {} // outro objeto vazio

console.log(a === b); // false

So when you put another object inside it, it tries to compare the object inside the indexOf with what's inside the array. It will always return false.

So it's not possible to do indexOf, so you'd have to look for other ways to do it.

    
30.10.2018 / 20:25
7

Let's print what you're looking for:

pessoas = [];
pessoas.push({"nome": "Pedro"})
pessoas.push({"nome": "João"})
pessoas.push({"nome": "Maria"})
pessoas.push({"nome": "José"})
for (let pessoa of pessoas) console.log(pessoa);

Note that it has objects, it has no text. In the first example is comparing with a text, it will not work anyway, an object is never equal to a simple text, they are already of different types, it can not be the same.

In the second you are using a member of an object to compare with a text, it happens that pessoas is not a object is an array with objects inside it, each element is an object , but not it as a whole, so it also does not make sense.

If you can change pessoas depending on how you change it is possible to make the first or second work, but it would be quite different. If you change the structure of pessoas one of the ways is to look at the hand (I prefer it because it is always the fastest of all the options, you can test each one of them). Something like this:

pessoas = [];
pessoas.push({"nome": "Pedro"})
pessoas.push({"nome": "João"})
pessoas.push({"nome": "Maria"})
pessoas.push({"nome": "José"})

function encontrar() {
    for (let pessoa of pessoas) {
        if (pessoa.nome === 'Pedro') {
            console.log('Já existe');
            return;
        }
    }
    console.log('Não existe');
}
encontrar()
    
30.10.2018 / 20:26
6

You can use map to return:

var pessoas = [];
pessoas.push({"nome": "Pedro"})
pessoas.push({"nome": "João"})
pessoas.push({"nome": "Maria"})
pessoas.push({"nome": "José"})

function encontrar() {

var retornoIndex = pessoas.map(function(e) { return e.nome; }).indexOf('Pedro');

if(retornoIndex < 0) {
    console.log('Não existe');
  }else {
  console.log('Já existe');
  }

}

encontrar();
    
30.10.2018 / 20:23
4

Using indexOf would be viable if your array contained only primitive types in this case use Array.prototype.findIndex()

  

Note: The findIndex () method returns the index of the first element in   matrix that satisfies the given test function. Otherwise,   returns -1, indicating that no element passed the test.   Source: link

pessoas = [];
pessoas.push({"nome": "Pedro"})
pessoas.push({"nome": "João"})
pessoas.push({"nome": "Maria"})
pessoas.push({"nome": "José"})

function encontrar() {

if(pessoas.findIndex(i => i.nome === "Pedro") < 0) {
    console.log('Não existe');
  }else {
  console.log('Já existe');
  }

}

encontrar()
    
30.10.2018 / 20:27
3

You are looking for index where it does not exist. That's why you can not find it. The correct code would be this:

pessoas = [];
pessoas.push("Pedro")
pessoas.push("João")
pessoas.push("Maria")
pessoas.push("José")

console.log(pessoas)

function encontrar() {

if(pessoas.indexOf('Pedro') < 0) {
    console.log('Não existe');
  }else {
  console.log('Já existe');
  }

}

encontrar()

The indexOf is looking for the "Pedro" only within the array it is finding only one object with other values. To find values in the object you can use the filter ().

    
30.10.2018 / 20:32