цикл forEach возвращает неопределенное значение - PullRequest
1 голос
/ 25 апреля 2019

У меня есть фиктивные данные (книги), которые я хочу видеть из graphiql gui . Но когда я использую цикл forEach для перебора книг, ища определенный id, он возвращает неопределенные значения, но если я использую обычный цикл for, он работает нормально.

Это мой код:

let books = [
    { name: 'Name of the Wind', genre: 'Horror', id: '1', authorID: '3' },
    { name: 'The Final Empire', genre: 'Fantasy', id: '2', authorID: '1' },
    { name: 'The Long Earth', genre: 'Sci-Fi', id: '3', authorID: '2' },
];
const RootQuery = new GraphQLObjectType({
    name: 'RootQueryType',
    fields: {
        book: {
            type: BookType,
            args: { id: { type: GraphQLString } },
            //this forEach is not working
            resolve(parent, args){
                books.forEach( function(book) {
                    if(book.id == args.id) {
                        console.log(book);
                        return book;
                    }
                }); 
            }
        }
    }
});

Когда я распечатываю данные книги, она показывает эту конкретную книгу в консоли, но не в ответе GUI:

request:
{
  book(id: "2") {
    name
    genre
  }
}
response: 
{
  "data": {
    "book": null
  }
}

1 Ответ

3 голосов
/ 25 апреля 2019

A return <value> в обратном вызове forEach не имеет смысла. Возвращаемое значение не идет никуда, и цикл также не прерывается.

Вместо этого используйте .find:

return books.find(function(book) {
    return book.id == args.id;
}); 

Когда важна производительность и у вас много книг, лучше сначала выполнить предварительную обработку книг и создать набор:

let books = [
    { name: 'Name of the Wind', genre: 'Horror', id: '1', authorID: '3' },
    { name: 'The Final Empire', genre: 'Fantasy', id: '2', authorID: '1' },
    { name: 'The Long Earth', genre: 'Sci-Fi', id: '3', authorID: '2' },
];
let bookIds = new Set(books.map(({id}) => id));

... и тогда не требуется никакого цикла, чтобы узнать действительный идентификатор книги или нет:

return bookIds.has(args.id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...