data-combiner

combine object to object by schema

Usage no npm install needed!

<script type="module">
  import dataCombiner from 'https://cdn.skypack.dev/data-combiner';
</script>

README

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