Credo che quello che stai cercando sia l'uso della funzione assignEntity
che può essere passata nelle opzioni di normalize
. In questo caso ci consente, se necessario, di filtrare le proprietà ridondanti data
e passare direttamente ai valori sottostanti.
Effettiva assignEntity
controlliamo come ogni chiave di dati viene normalizzata. Dai uno sguardo allo here per un po 'di più su come funziona.
Ho messo questo insieme come una dimostrazione, dare un'occhiata: http://requirebin.com/?gist=b7d89679202a202d72c7eee24f5408b6. Ecco un frammento:
book.define({
data: {
publisher: publisher,
author: author,
characters: normalizr.arrayOf(character)
}}
);
publisher.define({
data: {
country: country
}
});
const result = normalizr.normalize(response, book, { assignEntity: function (output, key, value, input) {
if (key === 'data') {
Object.keys(value).forEach(function(d){
output[d] = value[d];
})
} else {
output[key] = value;
}
}});
anche vedere in particolare Ln 29, in cui la matrice di characters
ha alcuni oggetti con l'informazione inserita all'interno data
e alcuni senza. Tutti sono normalizzati correttamente.
Ho anche aggiunto alcune parti per mostrare come funziona con array e dati profondamente annidati, vedere il modello country
all'interno di publisher
.
Con i dati forniti è necessario uno slug a causa dell'assenza di id, che ogni schema contiene anche nell'esempio.
Normalizr è fantastico, mi auguro che aiuta a spiegare un po 'più su di esso :)
JSON, che si registra non segue le specifiche [ 'JSONAPI'] (http://jsonapi.org/format/ # documento-alto livello). Rapidamente, non puoi nidificare altre risorse nella principale, ma per includere altre risorse nel payload devi usare la chiave specifica ['include'] (http://jsonapi.org/format/#fetching-includes) . Nella risorsa principale è possibile inviare solo [un insieme limitato di informazioni] (http://jsonapi.org/format/#document-resource- object-relationships) sulle relazioni tra sé e altre risorse sotto la chiave 'relazioni'. – NickGnd
Vostro diritto, aggiornerò la domanda – AndrewMcLagan