Graphql: как отобразить поля, начинающиеся с цифры - PullRequest
0 голосов
/ 08 декабря 2018

Изучение GraphQL прямо сейчас и возникновение проблем со свойствами объекта карты.

Я пытаюсь отобразить этот объект https://data.metromobilite.fr/api/ficheHoraires/json?route=SEM:C&time=1544221514650

(примечание: выможет изменить временную метку на будущую, найдите ее здесь https://currentmillis.com/)

Вот формат JSON:

{
    "0": {
        "arrets": [],
        "trips": [],
        "prevTime": 1544217780000,
        "nextTime": 1544229600000
    },
    "1": {}
}

Мой код:

const SheetType = new GraphQLObjectType({
  name: "Sheet",
  fields: () => ({
    arrets: { type: ArretsType },
    trips: { type: TripsType },
    prevTime: { type: GraphQLString },
    nextTime: { type: GraphQLInt }
  })
});

const TimeSheetType = new GraphQLObjectType({
  name: "TimeSheet",
  fields: () => ({
    0: { type: SheetType },
    1: { type: SheetType }
  })
});

Однако,Я не знаю, как сопоставить объект, так как ключи являются числами, и невозможно сопоставить поля по номерам (https://facebook.github.io/graphql/June2018/#sec-Names).

Что я могу сделать?

Спасибо.

1 Ответ

0 голосов
/ 08 декабря 2018

Если API всегда будет возвращать только ключи «0» и «1», вы можете просто иметь два произвольно названных поля, которые сопоставляются с ключами, возвращенными API.

const TimeSheetType = new GraphQLObjectType({
  name: "TimeSheet",
  fields: () => ({
    zero: {
      type: SheetType,
      resolve: (parent) => parent['0'],
    },
    one: {
      type: SheetType,
      resolve: (parent) => parent['1'],
    },
  })
})

Нас другой стороны, если API мог бы возвращать ключи с именами «2», «3», «4» и т. д., лучшим вариантом было бы изменить структуру структуры данных, чтобы вместо нее использовать массив.В этом случае вы полностью опускаете TimeSheetType и просто возвращаете List из SheetType с.

// An example of how you can iterate over keys and reduce an object to an array
const convertToArray = (obj) => Object.keys(obj).reduce((arr, key) => {
  arr[Number.parseInt(key, 10)] = obj[key]
  return arr
}, [])

// Example query returning the array of SheetType objects
const QueryType = new GraphQLObjectType({
  name: "Query",
  fields: () => ({
    getTimeSheets: {
      type: new GraphQLList(SheetType),
      resolve: async () => {
        const apiResponse = await getAPIResponse()
        return convertToArray(apiResponse)
      },
    },
  })
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...