npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

array2d

v0.0.5

Published

Utility library for working with 2D arrays (arrays of arrays) in JavaScript

Downloads

1,269

Readme

Array2D.js

Array2D.js is a utility library for working with 2D arrays (arrays of arrays) in JavaScript. It provides a suite of 100-odd functions that make it simple to manipulate these grid-like data structures. It includes the essential tools you would expect, such as crop, rotate, and transpose, as well as a slew of more specialized helpers. Array2D.js is small, standalone (no external dependencies), fully tested, and ready for use in Node.js or the browser.

Example

Here's a quick usage example, to give a sense of Array2D.js' style.

var grid = [[1,2,3], [4,5,6], [7,8,9]];
var result = Array2D.swap(Array2D.transpose(grid), 1,1, 2,2);
console.log(result);
// => [[1,4,7],[2,9,8],[3,6,5]]

And here's an illustration of the above operations:

1 2 3                1 4 7                            1 4 7
4 5 6  transpose ~>  2 5 8  swap (1,1) with (2,2) ~>  2 9 8
7 8 9                3 6 9                            3 6 5

Demo

See the unsophisticated demo page.

Features / Quick reference

Array2D.js provides the following functions. In general, each accepts an array of arrays (colloquially, a "grid") as the first argument. Arguments that take coordinate parameters receive them in row, column order (i.e., y, x). The input array is never modified; all functions whose purpose is to set/change the grid actually return a new grid.

Basic

get: Get a cell's value
set: Set a cell's value
width: Get the width of the grid (max row)
height: Get the height of the grid (max column)
dimensions: Get the grid's dimensions ([width, height])
area: Get the area of the grid (using width and height)
cells: Get the number of cells in the grid

Essentials

crop: Extract a subgrid of the given dimensions from the grid
harvest: Like crop, but can overstep the grid's bounds
rotate: Rotate the grid left/right (also lrotate, rrotate)
flip: Flip the grid vertically/horizontally (also vflip, hflip)
pan: Pan over the grid up/down/left/right (also upan, dpan, lpan, rpan)
slide: Slide the grid up/down/left/right (also uslide, dslide, lslide, rslide)
transpose: Transpose the grid (flip over its main diagonal)
antitranspose: Flip the grid over its secondary diagonal
fill: Fill all the grid's cells with a value
fillArea: Fill an area within the grid with a value
pad: Add padding to the grid on the top/bottom/left/right (also upad, dpad, lpad, rpad)
trim: Trim off from the grid's top/bottom/left/right (also utrim, dtrim, ltrim, rtrim)
stitch: Stitch two grids together (also ustitch, dstitch, lstitch, rstitch)
paste: Paste a grid within another grid, at the given coordinates
glue: Glue two grids together, at the given coordinates
shuffle: Rearrange the grid's cells randomly
tidy: Make the grid rectangular; fill missing cells with null

Construction / casting

clone: Clone (create a new copy of) the grid
build: Create a new grid with the given dimensions
buildWith: Create a new grid, using a cell-builder function
serialize: JSON-ify the grid
nullify: Convert all cells to null
integerize: Convert all cells to integers
stringize: Convert all cells to strings

Inspection / comparison / analysis

check: T/F whether the grid is an array of arrays
ragged: T/F whether any rows are different lengths
rectangular: T/F whether all rows are the same length
empty: T/F whether the grid has no cells
blank: T/F whether all the grid's cells are null/undefined
singular: T/F whether the grid has only one cell
multitudinous: T/F whether the grid has many cells
sparse: T/F whether the grid has any blank cells
dense: T/F whether the grid has no missing (undefined) cells
same: Compare two grids cell by cell; T/F if they are the same
different: Compare two grids cell by cell; T/F if they are different
diff: Return the coordinates of cells that are different between two grids
contains: T/F whether the grid has any cell with the given value
includes: T/F/ whether the grid contains another grid
symmetrical: T/F whether the grid is symmetrical (also hsymmetrical, vsymmetrical)

Iteration / collection

eachCell: Iterate over every cell (row-major)
nthCell: Iterate over every nth cell (row-major)
eachRow: Iterate over every row (row-major)
eachColumn: Iterate over every column (column-major)
forArea: Iterate over an area within the grid
forRow: Iterate over the cells in a row
forColumn: Iterate over the cells in a column
flatten: Convert the grid to a flat, row-major array
squash: Convert the grid to a flat, column-major array
map: Remap the grid into a new grid, cell by cell
reduce: Reduce the grid to a flat array, row-by-row
boildown: Reduce the grid to a flat array, column-by-column

Rows / columns

row: Get the row at the given row-coordinate
column: Get the column at the given column-coordinate
top: Get the top row
bottom: Get the bottom row
left: Get the left column
right: Get the right column
widest: Get the widest row
thinnest: Get the thinnest row
tallest: Get the tallest column
shortest: Get the shortest column
setRow: Set a row to a given array
setColumn Set a column to a given array
fillRow: Fill a row with a given value
fillColumn: Fill a column with a given value
spliceRow: Insert a row
spliceColumn: Insert a column
deleteRow: Delete a row
deleteColumn: Delete a column

Cells

exists: T/F whether the cell at coordinates exists (is not undefined)
occupied: T/F whether the cell at coordinates has content (is not null)
inBounds: T/F/ whether the cell is within the grid's area
copy: Copy a cell from one coordinate to another
move: Move a cell from one coordinate to another
swap: Swap two cells

Location / relationships

edge: T/F whether the cell is on an edge
edges: Get the list of edges the cell is on
corner: T/F whether the cell is on a corner
corners: Get the list of corners the cell is on
boundary: T/F whether the cell is on a boundary (ragged edge)
boundaries: Get the list of (ragged) boundaries the cell is on
crook: T/F whether the cell is on a crook (ragged corner)
crooks: Get the list of (ragged) corners the cell is on
center: T/F whether the cell is the center cell
interior: T/F whether the cell is in the interior of the grid
quadrants: Get the list of coordinate-plane quadrants the cell is within
orthogonals: Get all cells orthogonally adjacent to a cell
diagonals: Get all cells diagonally adjacent to a cell
neighbors: Get all cells adjacent to a cell
neighborhood: Extract a 9x9 subgrid centered on the given cell
euclidean: Get the Euclidean distance between two cells
chebyshev: Get the Chebyshev distance between two cells
manhattan: Get the Manhattan distance between two cells

Coordinates

find: Get a list of the coordinates of all matching cells
contiguous: Get a list of groups of coordinates of contiguous cells
touching: Get a list of groups of coordinates of touching cells
surrounds: Get a list of coordinates of a cell's surrounding cells

Import / export

fromArray: Build a grid of the given dimensions from a flat array
fromCanvas: Convert a <canvas> pixel data into a grid
toCanvas: Draw a grid onto a <canvas>

Reference

For complete documentation, please see the API reference.

Installation

You can install via npm:

npm install array2d

Or via Bower:

bower install array2d

Or simply download the minified source.

Development

Pull requests are welcome.

Testing

Run the tests with:

$ mocha test

Benchmarks

Run the benchmarks with:

$ node perf/general

See previous results in perf/RESULTS.md.

Author

Matthew Trost

Copyright

Copyright (c) 2014 Matthew Trost

License

MIT. See LICENSE.txt in this folder.