Dati JSON con chiave / indice per una facile ricerca

0

C'è qualche motivo per non creare dati JSON che possono essere indicizzati da qualche chiave? Ad esempio nell'API WhenIWork di seguito, utilizzando l'id dell'utente per accedere rapidamente ai dati? Il motivo per cui lo chiedo è perché sembra che per molti usi sul lato del client si possa facilmente indicizzare l'array e quindi acquisire i dati necessari rispetto al ciclo attraverso l'array JSON alla ricerca di un ID specifico. Ma molte API non lo fanno (2 di questi esempi di seguito).

WhenIWork API - Utenti

{
  "users": [
    {
      "id": 4364,
      "login_id": 2112,

      "first_name": "Goldie",
      "last_name": "Wilson",

    },
    {
      "id": 27384,
      "login_id": 2112,

      "email": "[email protected]",
      "first_name": "Jennifer",
      "last_name": "Parker",

    }
  ]
}

API GitHub - Eventi

[
  {
    "type": "Event",
    "public": true,
    "payload": {
    },
    "repo": {
      "id": 3,
      "name": "octocat/Hello-World",
      "url": "https://api.github.com/repos/octocat/Hello-World"
    },
    "actor": {
      "id": 1,
      "login": "octocat",
      "gravatar_id": "",
      "avatar_url": "https://github.com/images/error/octocat_happy.gif",
      "url": "https://api.github.com/users/octocat"
    },
    "org": {
      "id": 1,
      "login": "github",
      "gravatar_id": "",
      "url": "https://api.github.com/orgs/github",
      "avatar_url": "https://github.com/images/error/octocat_happy.gif"
    },
    "created_at": "2011-09-06T17:26:27Z",
    "id": "12345"
  }
]

Nel mio caso specifico ho una parte degli utenti dell'API che mi dà dati simili al codice sopra. Quindi andando a users/availability posso ottenere tutta la disponibilità per gli utenti. Ma ora devo scorrere tutti i dati alla ricerca di ID specifici.

{
  [
    {
      "user_id":"41",
      "date":"2017-07-01",
      "status":"Unavailable"
    },
    {
      "user_id":"41",
      "date":"2017-07-02",
      "status":"Available"},,
  [
    {
      "user_id":"47",
      "date":"2017-07-01",
      "status":"Available"
    },
    {
      "user_id":"47",
      "date":"2017-07-02",
      "status":"Leave\/TDY"
    }
  ]
}
    
posta keelerjr12 13.07.2017 - 01:14
fonte

1 risposta

1

Penso che la maggior parte delle API rappresentino quelle strutture dati con array invece di oggetti perché gli array supportano intrinsecamente l'iterazione, ma gli oggetti no. Ad esempio, per eseguire un'iterazione sulle chiavi in un oggetto JSON in JavaScript, è necessario esaminare le proprietà dell'oggetto (ma evitare determinate proprietà) utilizzando Object.keys o qualcosa di simile. L'iterazione è più naturale se vengono utilizzati gli array e un "indice" può essere costruito molto semplicemente ripetendo una volta l'array.

arr.reduce((index, item) => Object.extend({}, index, {[item.id]: item}), {})

Un altro motivo per cui un'API potrebbe utilizzare una matrice su un oggetto è che riflette il formato in cui i dati vengono recuperati dalla persistenza. In ogni database che ho usato i risultati sono sempre rappresentate insieme (ad esempio righe di query SQL), non una mappa, quindi è naturale portare quella struttura al livello dell'interfaccia senza cambiarla. Ulteriori raccolte funzionano indipendentemente dal fatto che esista o meno una chiave univoca, ma le mappe funzionano meglio con una chiave univoca.

Infine - gli array sono di tipo ordinato. Se l'ordine dei risultati ha un significato (come gli eventi in una timeline), restituire una mappa non sarebbe molto utile perché l'ordine delle proprietà in JSON non è destinato a essere mantenuto.

    
risposta data 13.07.2017 - 01:37
fonte

Leggi altre domande sui tag