Create a person object as an array within another object

Asked

Viewed 45 times

0

Speak Dev’s! All quiet?

Look, I’m sorry if there’s already this topic......

The help is a bit Noob, but will be of great value <3

This is the code:

/*BASE DE DADOS*/
var pessoas = {
    pessoa: {
        nome: "Lucas",
        idade: "28",
        localidade: "Cruzeiro - SP",
        email: "[email protected]"
    },
    pessoa: {
        nome: "José",
        idade: "45",
        localidade: "Manaus - AM",
        email: "[email protected]"
    },
    pessoa: {
        nome: "Marcos",
        idade: "31",
        localidade: "Babuê - MT",
        email: "[email protected]"
    }
}

/*FUNÇÃO QUE IRÁ VERIFICAR SE O CONTEÚDO DO INPUT É IGUAL A UM DOS NOMES NA BASE*/
function encontre(){
    var nomecoletado = "Lucas";

    for(pessoa in pessoas){
        switch(nomecoletado == pessoas.pessoa.nome){
            case "Lucas":
                alert('Eu encontrei este nome: ' + pessoas.pessoa.nome);
                break;
            case "José":
                alert('Eu encontrei este nome: ' + pessoas.pessoa.nome);
                break;
            case "Marcos":
                alert('Eu encontrei este nome: ' + pessoas.pessoa.nome);
                break;
            default:
                alert('Não encontrei nada...');
        }
    }
}

What I want is to show the alert according to the collected name. But I can not access correctly in the database. What generates as a response every time I call the function is that the name found is MARCOS, the last name of the database. I wonder if I can do this that I want to do. I’m studying JS, so I don’t want any framework or anything like, just pure JS.

Thanks from now on, guys! TMJ!

2 answers

2


First the literal syntax of the object pessoas (var obj = {chave1:valor,chave2:valor, ...} and the keys must be different) is wrong, it contains the same key for different values; therefore, it will only recognize the last element.

pessoas = {pessoa:{
email: "[email protected]"
idade: "31"
localidade: "Babuê - MT"
nome: "Marcos"}}

The object pessoas enters into the for only with this element, so always returns poor MARCOS.

Your object array should look like this:

var pessoas = [{
    nome: "Lucas",
    idade: "28",
    localidade: "Cruzeiro - SP",
    email: "[email protected]"
  },
  {
    nome: "José",
    idade: "45",
    localidade: "Manaus - AM",
    email: "[email protected]"
  },
  {
    nome: "Marcos",
    idade: "31",
    localidade: "Babuê - MT",
    email: "[email protected]"
  }
]

And the method that can best help you is find, for the find:

The method find () returns the value of the first element in the matrix that satisfies the given test function. Otherwise, undefined is returned.

While The Instruction switch

evaluates an expression, corresponding the value of the expression to a case clause and executes instructions associated with that case as well as instructions in cases following the corresponding case.

This way, using the find would look like this:

/*BASE DE DADOS*/
const pessoas = [{
    nome: "Lucas",
    idade: "28",
    localidade: "Cruzeiro - SP",
    email: "[email protected]"
  },
  {
    nome: "José",
    idade: "45",
    localidade: "Manaus - AM",
    email: "[email protected]"
  },
  {
    nome: "Marcos",
    idade: "31",
    localidade: "Babuê - MT",
    email: "[email protected]"
  }
]

/*FUNÇÃO QUE IRÁ VERIFICAR SE O CONTEÚDO DO INPUT É IGUAL A UM DOS NOMES NA BASE*/
function encontre(nomecoletado) {
  let found = pessoas.find(pessoa => {
    return (pessoa.nome.toLowerCase()).replace(/\s/g, '') === (nomecoletado.toLowerCase()).replace(/\s/g, ''); // Passar os nomes para minúsculos e remove espaços em branco, isso melhor o match
  })

  if (found) {
    alert('Eu encontrei este nome: ' + found.nome);
  } else {
    alert('Não encontrei nada...');
  }
}

function onclickBtn() {
  encontre(document.getElementById("nomePessoa").value);
}
<h2>Encontre a pessoa:</h2>

Nome da pessoa:<br>
<input type="text" id="nomePessoa" name="firstname" value="">
<br>
<br>
<br>

<button onclick="onclickBtn()">Buscar a pessoa</button>

  • WONDERFUL!!!!! Thank you very much Cristiano, solved my question 100%!! I tested and gave it right!! Just one question, I had to change the code inside the function because in your example, the function receives a value when called and I don’t know how to send the id of an input when calling the function by onclick. Is it possible? Otherwise, I’m very satisfied, the explanation was great! Thanks!

  • @Lucasneves will edit the answer to include the function

0

1) I believe that the switch is not suitable to solve your situation because it expects a unique object/value to compare with the cases and in yours you’re passing an expression (nomecoletado == pessoas.pessoa.nome) that can return true or false and when comparing the result of this expression with the cases the JS ends up getting confused. I suggest that debug the code in the browser for experience; 2) In response to the question itself, perhaps the filterhelp you:

// var pessoas = [ /* etc */ ]; // [] e não {}
var pessoas = [
    {
        nome: "Lucas",
        idade: "28",
        localidade: "Cruzeiro - SP",
        email: "[email protected]"
    },
    {
        nome: "José",
        idade: "45",
        localidade: "Manaus - AM",
        email: "[email protected]"
    },
    {
        nome: "Marcos",
        idade: "31",
        localidade: "Babuê - MT",
        email: "[email protected]"
    }
];
let selecao = pessoas.filter(p => p.nome.toLowerCase() == nomecoletado.toLowerCase())[0];

The filter will return you an array, so the [0] in order to get the first element. Do some tests and prepare the code for the possibility of filter return null or undefined also.

  • Show! I will test here and put the result!

  • I edited to include the array correctly.

  • Gustavo unfortunately did not generate any results.

  • Strange... it runs here: https://jsfiddle.net/GustavoAdolfo/1gpst2cr/1/ Make comparisons to ascertain.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.