var nest = require('nest'); var assert = require('assert'); var eq = assert.deepEqual; // input data to be nested var data = [ { type: "apple", color: "green", quantity: 1000 }, { type: "apple", color: "red", quantity: 2000 }, { type: "grape", color: "green", quantity: 1000 }, { type: "grape", color: "red", quantity: 4000 } ]; /* FIRST EXAMPLE */ // expected output, grouping by `color` and `quantity` var expected = { green: { "1000": [ { type: 'apple', color: 'green', quantity: 1000 }, { type: 'grape', color: 'green', quantity: 1000 } ] }, red: { "2000": [ { type: 'apple', color: 'red', quantity: 2000 } ], "4000": [ { type: 'grape', color: 'red', quantity: 4000 } ] } }; // key functions used for grouping criteria var byType = function(d) { return d.type; }; var byColor = function(d) { return d.color; }; var byQuantity = function(d) { return d.quantity; }; // nest by key name eq(nest(data, ['color', 'quantity']), expected); // nest by key function eq(nest(data, [byColor, byQuantity]), expected); /* SECOND EXAMPLE */ // expected output, grouping by `type` and `color` expected = { apple: { green: [ { "type": "apple", "color": "green", "quantity": 1000 } ], red: [ { "type": "apple", "color": "red", "quantity": 2000 } ] }, grape: { green: [ { "type": "grape", "color": "green", "quantity": 1000 } ], red: [ { "type": "grape", "color": "red", "quantity": 4000 } ] } }; // nest by key names eq(nest(data, ['type', 'color']), expected); // nest by key function eq(nest(data, [byType, byColor]), expected);