2015-11-04 3 views
4

Я искал normalizr для выравнивания данных API JSON, отформатированных в standard JSON API format. Может ли кто-нибудь указать мне на некоторые примеры этого? Я специально зацикливаюсь на том, как обрабатывать схему normalizr для отношений объекта ресурса (как определено стандартом API JSON). В стандарте API JSON существует свойство «отношений», определенное в объекте ресурса, а затем свойства для каждой группы связанных объектов. Вот пример одной категории продукта в формате JSON API с двумя родственными продуктами:Нормализация JSON API Standard v1

{ 
    "jsonapi": { 
    "version": "1.0" 
    }, 
    "meta": { 
    "time": "0.006" 
    }, 
    "data": [ 
    { 
     "type": "category", 
     "id": "6", 
     "attributes": { 
     "name": "Odwalla" 
     }, 
     "meta": { 
     "product_count": "0" 
     }, 
     "relationships": { 
     "product": { 
      "data": [ 
      { 
       "type": "product", 
       "id": "4785" 
      }, 
      { 
       "type": "product", 
       "id": "4786" 
      } 
      ] 
     } 
     } 
    } 
    ], 
    "included": [ 
    { 
     "type": "product", 
     "id": "4786", 
     "attributes": { 
     "name": "Strawberry & Banana Odwalla", 
     "description": null, 
     "price": "3.19", 
     "upc": "" 
     } 
    }, 
    { 
     "type": "product", 
     "id": "4785", 
     "attributes": { 
     "name": "Blueberry Odwalla", 
     "description": null, 
     "price": "3.19", 
     "upc": "" 
     } 
    } 
    ] 
} 

Содержащиеся в категории перечислены в data.relationships.product.data и те объекты продукта включены в прилагаемый массив. Я уверен, что есть несколько способов нормализовать это; что было бы самым эффективным и дружелюбным способом сгладить это для магазина Flux/Redux?

ответ

9

Насколько я понимаю json: api обеспечивает нормализованные данные. Связанные данные не связаны непосредственно с основным ресурсом, но included - см. Это Compound Documents и Fetching Includes. normalizr не предназначен для такой структуры данных, но вы можете легко создать что-то, что даст вам тот же результат, что и normalizr, если это ваше намерение. Из-за того, что json: api - очень строгий стандарт, с которым он отлично справляется. Вот как я попытался бы добиться этого, с большим количеством «вдохновения» из библиотеки нормализации ...

import { reduce, append } from 'ramda' 

export default function normalize({data, included}) { 
    let bag = {} 
    const result = visit(data, bag) 
    visit(included, bag) 

    return { 
    entities: bag, 
    result 
    } 
} 

function visitIterable(obj, bag) { 
    return reduce((acc, item) => { 
    const entityId = visitEntity(item, bag) 
    return append(entityId, acc) 
    }, [], obj) 
} 

function visitEntity(obj, bag) { 
    const entityKey = obj.type 
    const entityId = obj.id 

    if (!bag.hasOwnProperty(entityKey)) { 
    bag[entityKey] = {} 
    } 

    bag[entityKey][entityId] = obj 
    return entityId 
} 

function visit(obj, bag) { 
    if (Array.isArray(obj)) { 
    return { 
     list: visitIterable(obj, bag) 
    } 
    } else if (typeof obj === 'object') { 
    return { 
     item: visitEntity(obj, bag) 
    } 
    } 
}