Skip to content

Latest commit

 

History

History
167 lines (137 loc) · 2.94 KB

README.md

File metadata and controls

167 lines (137 loc) · 2.94 KB

collect.js

MapReduce Utility

What

Utility that calls one or more map() and reduce() functions over a series of data.

Install

npm install mattsacks/collect.js
bower install mattsacks/collect.js

Setup

Only the collect() function is exposed.

In node:

var collect = require('collect');

In the browser:

<body>
  ...
  <script src="collect.min.js"></script>
</body>

Docs

collect(data, maps[, options])

The main function, it takes in a dataset and over each item, it runs a map and reduce function found for each key in maps.

  • data (Array, Object): A series of data to run map and reduce functions on.
  • maps (Object): An object with either a top-level map and/or reduce function defined, or a map and/or reduce function defined for each key.
  • options (optional Object): a hash of options. Currently unused.

Speed

O(n * (number of map and reduce functions defined))

Example

var data = [0, 1, 2];

var maps = {
  plusOne: {
    map: function(x, i) {
      return x + 1;
    }
  },
  sum: {
    reduce: function(result, current, x, i) {
      return result == null ? current : result + current;
    }
  }
};

collect(data, maps); // { plusOne: [1, 2, 3], sum: 3 }

maps.plusOneSum = {
  map: maps.plusOne.map,
  reduce: function(result, current) {
    return result + current;
  },
  init: 0 // initial value for result
};

collect(data, maps); // { plusOne: [1, 2, 3], sum: 3, plusOneSum: 6 }
collect(data, maps.plusOneSum); // 6

Advanced

Reduce on mapped data

var data = [0, 1, 2];

// Reference existing maps within 
var maps = {
  plusOne: {
    map: function(x) {
      return x + 1;
    }
  },
  sum: {
    data: 'plusOne',
    reduce: function(result, current) {
      return result + current;
    },
    init: 0
  },
  times: {
    data: 'plusOne',
    reduce: function(result, current) {
      return result * current;
    },
    init: 1
  }
};

collect(data, maps); // { plusOne: [1, 2, 3], sum: 6, times: 6 };

Reduce from a reduced result

var data = [0, 1, 2];

// Init from the result of another reduce
var maps = {
  plusOneSum: {
    map: function(x) {
      return x + 1;
    },
    reduce: function(result, current) {
      return result + current;
    },
    init: 0
  },
  sumPlusOneSum: {
    // 6 + 0 + 1 + 2
    reduce: function(result, current) {
      return result + current;
    },
    init: 'plusOneSum'
  }
};

collect(data, maps); // { plusOneSum: 6, sumPlusOneSum: 9 }

Context inside of maps

var data = [0, 1, 2];

// Reference existing maps within 
var maps = {
  plusOne: {
    map: function(x) {
      return x + 1;
    }
  },
  arrays: {
    data: 'plusOne',
    reduce: function(result, current) {
      result.push(this);
      return result;
    },
    init: []
  }
};

collect(data, maps);
// {
//   plusOne: [1, 2, 3],
//   arrays: [[1, 2, 3], [1, 2, 3], [1, 2, 3]]
// }