Cuando tengo objetos en Array como

    var bookIndex =  [{
      id: '1',
      title: 'First title',
      description: 'This is my first title'
    }, {
      id: '2',
      title: 'Second title',
      description: 'This is my second title'
    }];

Luego recorrer la matriz usando for ()

    function getBook(bookId){
      for (var i = 0; i < bookIndex.length; i++) {
        if (bookIndex[i].id === bookId) {
          return bookIndex[i];
        }
       }
       return undefined;
     };

Me pregunto cómo usar otro método de bucle para obtener el mismo resultado. Ex. para cada. Intento usar algo como esto, pero no pude obtener el objeto de retorno que quiero.

    function getBook(bookId) {
      bookIndex.forEach(function () {
        if (bookId === bookIndex.id) {
          return bookId;
        }
        return undefined;
      });
    };
2
Mac L. Lak 11 may. 2016 a las 17:30

4 respuestas

La mejor respuesta

Usarías .find():

function getBook(bookId) {
  return bookIndex.find(function(book) { return book.id === bookId; });
}

La devolución de llamada a .find() debe devolver true cuando se cumplan los criterios. Cuando eso sucede, .find() devuelve ese elemento de la matriz. Si ningún elemento coincide, devuelve undefined.

La función .forEach() es útil, pero realmente es para situaciones en las que realmente desea realizar alguna operación en cada elemento de la matriz.

5
Mac L. Lak 11 may. 2016 a las 16:25

Puede usar filter y devolver el objeto con esa identificación.

var bookIndex = [{
   id: '1',
   title: 'First title',
   description: 'This is my first title'
 }, {
   id: '2',
   title: 'Second title',
   description: 'This is my second title'
 }];

 function getBook(bookId) {
    return bookIndex.filter((e) => { return parseInt(e.id) == parseInt(bookId)})[0];
 };
 
 console.log(getBook(2))
1
Nenad Vracar 11 may. 2016 a las 14:51

Te pregunté dónde te preguntabas cómo podrías para el bucle y luego regresar, y como cada bruja respondió que no usaste para cada uno, decidí mostrarte una solución foreach, esperando que esto sea lo que esperabas

var bookIndex = [
    {
        id: '1',
        title: 'First title',
        description: 'This is my first title'
    }, {
        id: '2',
        title: 'Second title',
        description: 'This is my second title'
    }];
function getBook(bookId) {
    bookIndex.forEach( function (el) {
        if (el.id === bookId) {
          getBook1(el);
        }
    });
}
getBook('2');
function getBook1(el) {
 var element = el;
    console.log(element);
}

En bookIndex.forEach( function (el) necesita pasar un argumento a la función (la devolución de llamada), que utiliza para el método forEach. Y este fue tu principal error. Este elemento que he pasado llamado el es básicamente cada elemento en su matriz que no está indefinido o nulo. Y dado que no puede devolver algo desde el foreach, porque regresa a la devolución de llamada, no a la función parental, en su caso function getBook(index), tuve que llamar a otra función en la que puedo almacenar la variable

1
Все Едно 11 may. 2016 a las 15:24

Puede usar Array#some()

El método some() prueba si algún elemento de la matriz pasa la prueba implementada por la función proporcionada.

function getBook(bookId) {  // returns true or false if the book exists
    return bookIndex.some(function (book) {
        return bookId === book.id;
    });
};

Para devolver el objeto del libro, puede usar

function getBook(bookId) {  // returns the book with the index
    var book;
    bookIndex.some(function (b) {
        if (bookId === b.id) {
           book = b;
           return true;
        }
    });
    return book;
};
1
Mac L. Lak 11 may. 2016 a las 15:05