Skip to content

Latest commit

 

History

History
191 lines (147 loc) · 6.45 KB

README.md

File metadata and controls

191 lines (147 loc) · 6.45 KB

JavaScript Array Matrix

A lightweight and performant data structure for storing JavaScript objects in an n-way or n-order array matrix.

Array Matrix Demo

Table of contents

Getting Started

First, add the module to your project:

npm i -S javascript-array-matrix

Import ArrayMatrix into your project:

import ArrayMatrix from 'javascript-array-matrix';

OR

const ArrayMatrix = require('javascript-array-matrix');

Making a Matrix

To create a new array matrix, you instantiate a new ArrayMatrix object with a configuration object:

const myMatrix = new ArrayMatrix(configs);

Configuration Properties

data Property

type: {Array}

Required

This is an array of objects that will be parsed and organized into the array matrix. The objects do not have to match exactly, but each object must have the properties corresponding to the orders passed in as arguments.

orders Property

type: {Array}

Required

Each string in they array must correspond to a key or property on the objects passed in the data argument Array.

The more properties that are provided, the higher the order or rank of the matrix, and more dimensions in the array. You should provide the minimum number of orders required to map each object to a cell in the array.

Example: if you are selling a T-shirt, you would want two orders: size and color. When you know the size and color of the T-shirt, you would use those values to access the product in the Array Matrix, allowing you to get the sku, price, availability, etc.

If there are multiple T-shirts on a single page, you may want to use three orders: size, color, and manufacturer. Or maybe size, color, and style number. The important take-away is that you have the minimum number of orders/properties necessary so that each maps to at most 1 object per cell.

There will be situations where you may have 0 objects per cell, and that is okay. The Array Matrix will return null for those cells. (ex.: Blue T-shirts in Small, but not Red T-shirts in Small).

Example Matrix

const matrixData = [
  { color: 'Blue', size: 'Small', sku: '123' },
  { color: 'Blue', size: 'Medium', sku: '124' },
  { color: 'Red', size: 'Medium', sku: '125' },
  { color: 'Blue', size: 'Large', sku: '126' },
  { color: 'Red', size: 'Large', sku: '127' },
  { color: 'Green', size: 'Large', sku: '128' }
];

const matrixOrders = ['color', 'size'];

const matrix = new ArrayMatrix({
  data: matrixData,
  orders: matrixOrders
});

Querying Data

getEntry

Gets a single entry from the matrix at the provided points.

Parameters

points {Object}: an object with keys corresponding to the orders or axes of the matrix, and the value corresponding to the label or name of the point in the matrix.

Using our Example Matrix:

const chosenTShirt = matrix.getEntry({ size: 'Medium', color: 'Red' });
// chosenTshirt points to { color: 'Red', size: 'Medium', sku: '125' }

NOTE: When querying for an entry, the number of keys in the points argument object needs to equal the number of orders present in the matrix.

getDimension

Gets multiple entries from a dimension in the matrix from the provided points. The missing axis/points is the dimension that is returned.

Parameters

points {Object}: an object with keys corresponding to the orders or axes of the matrix, and the value corresponding to the label or name of the point in the matrix.

Unlike getEntry, getDimension takes a points argument Object with the number of keys one less than the number of orders present in the matrix.

Using our Example Matrix:

const allBlueShirts = matrix.getDimension({ color: 'Blue' });
// allBlueShirts is [
//    { color: 'Blue', size: 'Small', sku: '123' },
//    { color: 'Blue', size: 'Medium', sku: '124' },
//    { color: 'Blue', size: 'Large', sku: '126' }
// ];

const allSmallShirts = matrix.getDimension({ size: 'Medium' });
// allSmallShirts is [
//    { color: 'Blue', size: 'Medium', sku: '124' },
//    { color: 'Red', size: 'Medium', sku: '125' },
// ];

NOTE: Currently ArrayMatrix only supports returning 1 dimension at a time. Adding functionality to return more than one dimension is being reviewed and undergoing performance tests.

For examples on how this can scale to use 3, 4, ... n level orders, see our Demo.

Additional Methods

getAxes

NOTE: axes is the plural of axis, and is not the the tool used by lumberjacks or weapon used by Medieval Vikings.

Gets the axes and named points along those axes.

Using our Example Matrix:

const matrixAxes = matrix.getAxes();
// matrixAxes is {
//    color: ['Blue', 'Red', 'Green'],
//    size: ['Small', 'Medium', 'Large']
// };

getAxisPoints

Gets the points along an axis and returns the named points.

Parameters

axis {String}: The name of the axis whose named points you want.

Using our Example Matrix:

const axisPoints = matrix.getAxisPoints('color');
// axisPoints is ['Blue', 'Red', 'Green'];

debug

Returns all the data stored in the array matrix - matrix, props, axes.

Demo and Performance

For more advanced demonstration of different 2, 3, and 4 order array matrices, the App has examples. Running the project locally starts the demo application, where you can play with queries and see performance results as well.

Here is the Demo.

Dev Workflow

  • npm run dev starts a local development server, opens the dev page with your default browser, and watches for changes via livereload

  • npm run build compiles commonjs and ES modules and places them in the dist directory

  • npm test runs test using Jest + Enzyme.