object-mappr

Map, alias, and flatten object values to other object values.

npm install object-mappr
4 downloads in the last week
8 downloads in the last month

object-mappr Donate on Gittip

Map, alias, and flatten object values to other object values.

This project was created as part of doubleshot, perfoming the value mapping, aliasing, and flattening duties.

Getting Started

Install the module with: npm install object-mappr

Below is an example of what goes on under the hood of doubleshot.

// Map over test content
var objectMapper = require('object-mappr'),
    mappedObj = objectMapper({
      '1 + 2': ['One', 'plus two'],
      'One': function () {
        this.sum = 1;
      },
      'plus two': function () {
        this.sum += 2;
      },
      '= 3': 'equals three',
      'equals three': function () {
        assert.strictEqual(this.sum, 3);
      }
    }, {
    // Alias, map, and flatten values to other values
      alias: true,
      map: true
    });

// Result looks like
mappedObj;
/*
{
  '1 + 2': [
    function () {
      this.sum = 1;
    },
    function () {
      this.sum += 2;
    }
  ],
  'One': function () {
    this.sum = 1;
  },
  'plus two': function () {
    this.sum += 2;
  },
  '= 3': function () {
    assert.strictEqual(this.sum, 3);
  },
  'equals three': function () {
    assert.strictEqual(this.sum, 3);
  }
}
*/

Documentation

object-mappr provides a function to process aliasing, mapping, and flattening on.

/**
 * Map, alias, and flatten object values to other object values.
 * @param {Object} input Object with values to map
 * @param {Object} [options] Flags to adjust how the mapping is performed
 * @param {Boolean} [options.alias] If the value is a string, `value = input[value]`
 * @param {Boolean} [options.map] If a value is an array, its values will be processed via the aliasing proxy.
 * @param {Boolean} [options.flatten] If the value is an array and contains arrays, the array will be flattened.
 * @param {Function[]} [options.middlewares] If provided, these functions will be appended to the array of middlewares.
 * @returns {Object} Mapped, aliased, and flattened copy of `input`
 */

Examples

Here is an example using map, alias, and flatten

// A complex mapping
var mappedObj = objectMapper({
      'A fruit': 'A banana',
      'A banana': function () {
        this.color = 'yellow';
        this.fruit = new Banana();
      },
      'is yellow': ['hasColor', 'assertColor'],
      'when peeled is white': ['when peeled', 'is white'],
      'when peeled': function () {
        this.color = 'white';
        this.fruit = this.fruit.peel();
      },
      'is white': ['hasColor', 'assertColor'],
      'hasColor': function () {
        assert(this.fruit.color);
      },
      'assertColor': function () {
        assert.strictEqual(this.fruit.color, this.color);
      }
    }, {
      alias: true,
      map: true,
      flatten: true
    });

// when mapped looks like
mappedObj;
/*
{
  'A fruit': function () {
    this.color = 'yellow';
    this.fruit = new Banana();
  },
  'A banana': function () {
    this.color = 'yellow';
    this.fruit = new Banana();
  },
  'is yellow': [
    function () {
      assert(this.fruit.color);
    },
     function () {
      assert.strictEqual(this.fruit.color, this.color);
    }
  ],
  'when peeled is white': [
     function () {
      this.color = 'white';
      this.fruit = this.fruit.peel();
    },
    function () {
      assert(this.fruit.color);
    },
     function () {
      assert.strictEqual(this.fruit.color, this.color);
    }
  ],
  'when peeled': function () {
    this.color = 'white';
    this.fruit = this.fruit.peel();
  },
  'is white': [
    function () {
      assert(this.fruit.color);
    },
     function () {
      assert.strictEqual(this.fruit.color, this.color);
    }
  ],
  'hasColor': function () {
    assert(this.fruit.color);
  },
  'assertColor': function () {
    assert.strictEqual(this.fruit.color, this.color);
  }
}
*/

Contributing

In lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint via grunt and test via npm test.

License

Copyright (c) 2013 Todd Wolfson

Licensed under the MIT license.

npm loves you