40 lines
963 B
JavaScript
40 lines
963 B
JavaScript
// Stack grow safe implementation
|
|
|
|
"use strict";
|
|
|
|
var ensureValue = require("../../object/valid-value")
|
|
, isArray = Array.isArray
|
|
, objHasOwnProperty = Object.prototype.hasOwnProperty;
|
|
|
|
module.exports = function () {
|
|
var input = ensureValue(this), index = 0, remaining, remainingIndexes, length, i, result = [];
|
|
// Jslint: ignore
|
|
main: while (input) {
|
|
length = input.length;
|
|
for (i = index; i < length; ++i) {
|
|
if (!objHasOwnProperty.call(input, i)) continue;
|
|
if (isArray(input[i])) {
|
|
if (i < length - 1) {
|
|
// eslint-disable-next-line max-depth
|
|
if (!remaining) {
|
|
remaining = [];
|
|
remainingIndexes = [];
|
|
}
|
|
remaining.push(input);
|
|
remainingIndexes.push(i + 1);
|
|
}
|
|
input = input[i];
|
|
index = 0;
|
|
continue main;
|
|
}
|
|
result.push(input[i]);
|
|
}
|
|
if (remaining) {
|
|
input = remaining.pop();
|
|
index = remainingIndexes.pop();
|
|
} else {
|
|
input = null;
|
|
}
|
|
}
|
|
return result;
|
|
};
|