Skip to content

Commit a3f6ea8

Browse files
committed
improve perf and update to standard style
1 parent 1875f81 commit a3f6ea8

File tree

4 files changed

+67
-37
lines changed

4 files changed

+67
-37
lines changed

README.md

+9-6
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
# Array Flatten
22

33
[![NPM version][npm-image]][npm-url]
4+
[![NPM downloads][downloads-image]][downloads-url]
45
[![Build status][travis-image]][travis-url]
56
[![Test coverage][coveralls-image]][coveralls-url]
67

7-
Flatten an array of nested arrays into a single flat array. Accepts an optional depth argument.
8+
> Flatten an array of nested arrays into a single flat array. Accepts an optional depth.
89
910
## Installation
1011

@@ -15,17 +16,17 @@ npm install array-flatten --save
1516
## Usage
1617

1718
```javascript
18-
var flatten = require('array-flatten');
19+
var flatten = require('array-flatten')
1920

20-
flatten([1, [2, [3, [4, [5], 6], 7], 8], 9]);
21+
flatten([1, [2, [3, [4, [5], 6], 7], 8], 9])
2122
//=> [1, 2, 3, 4, 5, 6, 7, 8, 9]
2223

23-
flatten([1, [2, [3, [4, [5], 6], 7], 8], 9], 2);
24+
flatten([1, [2, [3, [4, [5], 6], 7], 8], 9], 2)
2425
//=> [1, 2, 3, [4, [5], 6], 7, 8, 9]
2526

2627
(function () {
27-
flatten(arguments); //=> [1, 2, 3]
28-
})(1, [2, 3]);
28+
flatten(arguments) //=> [1, 2, 3]
29+
})(1, [2, 3])
2930
```
3031

3132
## License
@@ -34,6 +35,8 @@ MIT
3435

3536
[npm-image]: https://img.shields.io/npm/v/array-flatten.svg?style=flat
3637
[npm-url]: https://npmjs.org/package/array-flatten
38+
[downloads-image]: https://img.shields.io/npm/dm/array-flatten.svg?style=flat
39+
[downloads-url]: https://npmjs.org/package/array-flatten
3740
[travis-image]: https://img.shields.io/travis/blakeembrey/array-flatten.svg?style=flat
3841
[travis-url]: https://travis-ci.org/blakeembrey/array-flatten
3942
[coveralls-image]: https://img.shields.io/coveralls/blakeembrey/array-flatten.svg?style=flat

array-flatten.js

+35-8
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,44 @@
11
/**
2-
* Recursive flatten function. Fastest implementation for array flattening.
2+
* Recursive flatten function with depth.
33
*
44
* @param {Array} array
55
* @param {Array} result
66
* @param {Number} depth
77
* @return {Array}
88
*/
9-
function flatten (array, result, depth) {
9+
function flattenDepth (array, result, depth) {
1010
for (var i = 0; i < array.length; i++) {
11-
if (depth > 0 && Array.isArray(array[i])) {
12-
flatten(array[i], result, depth - 1);
11+
var value = array[i]
12+
13+
if (depth > 0 && Array.isArray(value)) {
14+
flattenDepth(value, result, depth - 1)
15+
} else {
16+
result.push(value)
17+
}
18+
}
19+
20+
return result
21+
}
22+
23+
/**
24+
* Recursive flatten function. Omitting depth is slightly faster.
25+
*
26+
* @param {Array} array
27+
* @param {Array} result
28+
* @return {Array}
29+
*/
30+
function flattenForever (array, result) {
31+
for (var i = 0; i < array.length; i++) {
32+
var value = array[i]
33+
34+
if (Array.isArray(value)) {
35+
flattenForever(value, result)
1336
} else {
14-
result.push(array[i]);
37+
result.push(value)
1538
}
1639
}
1740

18-
return result;
41+
return result
1942
}
2043

2144
/**
@@ -26,5 +49,9 @@ function flatten (array, result, depth) {
2649
* @return {Array}
2750
*/
2851
module.exports = function (array, depth) {
29-
return flatten(array, [], depth || Infinity);
30-
};
52+
if (depth == null) {
53+
return flattenForever(array, [])
54+
}
55+
56+
return flattenDepth(array, [], depth)
57+
}

package.json

+7-5
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "array-flatten",
33
"version": "1.0.2",
4-
"description": "Flatten a multi-dimensional array.",
4+
"description": "Flatten an array of nested arrays into a single flat array",
55
"main": "array-flatten.js",
66
"files": [
77
"array-flatten.js",
@@ -17,7 +17,8 @@
1717
"keywords": [
1818
"array",
1919
"flatten",
20-
"arguments"
20+
"arguments",
21+
"depth"
2122
],
2223
"author": {
2324
"name": "Blake Embrey",
@@ -30,8 +31,9 @@
3031
},
3132
"homepage": "https://github.com/blakeembrey/array-flatten",
3233
"devDependencies": {
33-
"istanbul": "^0.2.6",
34-
"mocha": "^1.18.0",
35-
"pre-commit": "0.0.9"
34+
"istanbul": "^0.3.13",
35+
"mocha": "^2.2.4",
36+
"pre-commit": "^1.0.7",
37+
"standard": "^3.7.3"
3638
}
3739
}

test.js

+16-18
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,26 @@
11
/* global describe, it */
22

3-
var assert = require('assert');
4-
var flatten = require('./');
3+
var assert = require('assert')
4+
var flatten = require('./')
55

66
describe('array-flatten', function () {
77
it('should flatten an array', function () {
8-
assert.deepEqual(
9-
flatten([1, [2, [3, [4, [5]]], 6, [[7], 8], 9], 10]),
10-
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
11-
);
12-
});
8+
var res = flatten([1, [2, [3, [4, [5]]], 6, [[7], 8], 9], 10])
9+
10+
assert.deepEqual(res, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
11+
})
1312

1413
it('should flatten an array to a specific depth', function () {
15-
assert.deepEqual(
16-
flatten([1, [2, [3], 4], 5], 1),
17-
[1, 2, [3], 4, 5]
18-
);
19-
});
14+
var res = flatten([1, [2, [3], 4], 5], 1)
15+
16+
assert.deepEqual(res, [1, 2, [3], 4, 5])
17+
})
2018

2119
it('should clone an array when no depth is specified', function () {
22-
var array = [1, 2, 3];
23-
var clone = flatten(array, 0);
20+
var array = [1, [2, 3]]
21+
var clone = flatten(array, 0)
2422

25-
assert.ok(clone !== array);
26-
assert.deepEqual(clone, array);
27-
});
28-
});
23+
assert.ok(clone !== array)
24+
assert.deepEqual(clone, array)
25+
})
26+
})

0 commit comments

Comments
 (0)