0.3.1 • Published 8 years ago

data-combiner v0.3.1

Weekly downloads
6
License
MIT
Repository
github
Last release
8 years ago

data-combiner

Code Climate Test Coverage Build Status

combine object to object by schema

install

npm i --save data-combiner@latest

usage

// for example, your user posts api response seems like this
var data = {

    // set of count for pagination
    metadata: {
        resultset: {count: 3, total: 10, limit: 2, offset: 0}
    },

    // user profiles
    users: [
        {id: 'u1', login: 'A User'},
        {id: 'u2', login: 'B User'},
    ],

    // count of likes per post
    likeCounts: [
        {id: 1, count: 3},
        {id: 2, count: 4}
    ],

    // array with posts
    result: [
        {id: 1, userId: 'u1', text: 'a'},
        {id: 2, userId: 'u2', text: 'b'}
    ]
};

// in browser (or in node.js service) you want work with this object
var result = {
    resultset: {count: 3, total: 10, limit: 2, offset: 0},
    posts: [
        {id: 1, userId: 'u1', text: 'a', user: {id: 'u1', login: 'A User'}, stars: 3},
        {id: 2, userId: 'u2', text: 'b', user: {id: 'u2', login: 'A User'}, stars: 4}
    ]
};

// write schema
var schema = [

    // transform array to object in data original object
    ['dataArrayToObject', {from: 'users', to: 'users', byKey: 'id'}],
    ['dataArrayToObject', {from: 'likeCounts', to: 'likeCounts', byKey: 'id'}],

    // map resultset to result object
    ['map', {from: 'metadata.resultset', to: 'resultset'}],

    // combine new posts object with dicts (users and likeCounts)
    ['combine', {
        for: 'result',
        each: [
            ['add', {byKey: 'userId', fromObject: 'users', to: 'user'}],
            ['add', {byKey: 'id', fromObject: 'likeCounts', get: 'count', to: 'stars'}],
        ],
        to: 'posts'
    }]

];

// create combiner item

var combine = require('data-combiner');

var resultWhatYouWant = combine(schema, data);

// simple you can create combine function and combine your object without passing schema

var createCombine = require('data-combiner/create');

var myCombine = createCombine(schema);

var resultWhatYouWant = myCombine(data);

documentation

schema is Array

And every array element is array in format: [<name of step>, <step config>]

steps

map

copy object from data object by key from to result object key to

format

[
	'map',
	{
		'from': '<data key>',
		'to': '<result key>',
		'default': '<default value>'
	}
]

arrayToObject

convert array to object using lodash function _.keyBy

format

[
	'arrayToObject',
	{
		'from': '<data key>',
		'to': '<result key>',
		'byKey': '<key in data array item>',
		'default': '<default value>'
	}
]

dataArrayToObject

same as arrayToObject, but do it from data object to data object

format

[
	'arrayToObject',
	{
		'from': '<data key>',
		'to': '<data key>',
		'byKey': '<key in data array item>',
		'default': '<default value>'
	}
]

combine

format

[
	'combine',
	{
		'for': '<key in data, value should be array>',

		// for each item of "for" value
		'each': [

			[
				'add',
				{
					'byKey': '<dict object id>',
					'fromObject': '<data object key>',
					'to': 'key in new item>',
					'default': '<default value>'
				}
			],

			['remove', '<array of keys will be removed from item>']
		],


		to: '<key in result for save new combined array>'
	}
]

LICENSE

MIT

0.3.1

8 years ago

0.3.0

8 years ago

0.2.2

8 years ago

0.2.1

8 years ago

0.2.0

8 years ago

0.1.0

8 years ago