Suponiendo una matriz que contiene los nombres de los estudiantes y su puntaje respectivo, quiero recuperar la puntuación de cierto estudiante (marcando si el elemento de la matriz contiene el nombre del estudiante (cadena))

Se me ocurrió esto, pero no funciona.

var students = [
  ['David', 80],
  ['Dane', 77],
  ['Dick', 88],
  ['Donald', 95],
  ['Dean', 68]
];


function test() {
  for (var i = 0; i < students.length; i++) {
    var name = document.getElementById("namebox").value;
    var string = students[i].toString();
    if (string.includes(name);) {
      alert(students[i][1]);
    }
  }
};
<input type="text" id="namebox" /><button type="button" onclick="test()">Click</button>
1
Ah Quan 14 ene. 2017 a las 12:37

3 respuestas

La mejor respuesta

Su código debería funcionar, excepto por el error de sintaxis en la condición if, que tiene un ; que no debería estar allí. Elimínalo y funciona:

var students = [
    ['David', 80],
    ['Dane', 77],
    ['Dick', 88],
    ['Donald', 95],
    ['Dean', 68]
];

function test(){
    for (var i = 0; i < students.length; i++) {
        var name = document.getElementById("namebox").value;
        var string = students[i].toString();
        if (string.includes(name))
        {
          console.log(students[i][1]);
        }
    }
};
<input type="text" id="namebox" /><button type="button" onclick="test()">Click</button>

Pero hay algunas ineficiencias en su código:

  • No lea el valor de entrada en cada iteración del bucle, solo necesita hacer esto una vez.
  • En lugar de convertir el par students[i] en cadena, parece más importante mirar students[i][0], que ya es una cadena
  • Dado que está utilizando .includes() y, por lo tanto, se está ejecutando en un navegador moderno, ¿por qué no utilizar las otras funciones disponibles en ES6, como .find()?

Aquí es lo mismo con un código ES6 más eficiente:

const students = [
    ['David', 80],
    ['Dane', 77],
    ['Dick', 88],
    ['Donald', 95],
    ['Dean', 68]
];

const box = document.getElementById("namebox");

function test(){
    const value = box.value;
    const match = students.find(student => student[0].includes(value));
    if (match) {
      console.log(match[1]);
    }
};
<input type="text" id="namebox" /><button type="button" onclick="test()">Click</button>
1
trincot 14 ene. 2017 a las 10:04

Puede usar Array#filter y devuelve una matriz con los nombres coincidentes.

function getStudentsByName() {
    var name = document.getElementById("namebox").value.toLowerCase();
    document.getElementById("out").innerHTML = JSON.stringify(students.filter(function (a) {
        return a[0].toLowerCase() === name;
    }), 0, 4);
}

var students = [['David', 67], ['David', 80], ['Dane', 77], ['Dick', 88], ['Donald', 95], ['Dean', 68]];
<input type="text" id="namebox" /><button type="button" onclick="getStudentsByName()">Click</button>
<pre id="out"></pre>
1
Nina Scholz 14 ene. 2017 a las 10:48

Estás haciendo students[i].toString(). Esto devolverá solo una cadena que contiene los elementos de la matriz. Por lo tanto, sugiera que no haga toString e itere sobre cada elemento y use la indexación. Y también dentro de la primera matriz que puede contener objects de students, será más lógico.

Mueve el

var namebox = document.getElementById("namebox");

Fuera de for loop. Cada vez que el motor pasa un tiempo para encontrar el elemento en el bucle for. Entonces lo obtienes una vez y lo usas muchas veces.

Sintaxis ES6

let students = [
    {name: 'David', score: 80},
    {name: 'Dane', score: 77},
    {name: 'Dick', score: 88},
    {name: 'Donald', score: 95},
    {name: 'Dean', score: 68}
];

let namebox = document.getElementById("namebox");

function test(){
  
   let name = namebox.value;

   students.forEach(item => {

     if(item.name.includes(name)){
       console.log(name, item.name, item.score);
     }

  });
  
}
<input type="text" id="namebox" />
<button type="button" onclick="test()">Click</button>

Sintaxis ES5

var students = [
        {name: 'David', score: 80},
        {name: 'Dane', score: 77},
        {name: 'Dick', score: 88},
        {name: 'Donald', score: 95},
        {name: 'Dean', score: 68}
    ];

var namebox = document.getElementById("namebox");

function test(){
  
   var name = namebox.value;

   for(var i = 0; i < students.length; i++){

      if(students[i].name.indexOf(name) !== -1)  {
         console.log(name,students[i].name,students[i].score);
      }

   }
  
}
<input type="text" id="namebox" />
<button type="button" onclick="test()">Click</button>
4
Suren Srapyan 14 ene. 2017 a las 10:05