jsonstore-js
Version:
A javascript JSON data store with manifold abilities of data processing
176 lines (163 loc) • 4.68 kB
JavaScript
;
var utils = require('./utils');
var splice = Array.prototype.splice;
var createArray = function createArray(length, infilling) {
length = length || 0;
var arr = [],
i = 0;
for (; i < length; i++) {
arr.push(infilling === undefined ? null : utils.copy(infilling));
}
return arr;
};
var is2dArray = function is2dArray(arr) {
var is2d;
if (is2d = utils.type(arr) === 'array' && arr.length > 0) {
var i = 0,
len = arr.length;
for (; i < len; i++) {
is2d &= utils.type(arr[i]) === 'array';
if (!is2d) return false;
}
return true;
}
return false;
};
var create2dArray = function create2dArray(row, col, infilling) {
row = row || 0;
col = col || 0;
var arr = new Array(row),
i = 0;
for (; i < row; i++) {
arr[i] = createArray(col, infilling);
}
return arr;
};
var parseArrayIndex = function parseArrayIndex(index) {
var type = utils.type(index);
if (type === 'string' || type === 'number') {
return parseInt(index);
}
return void 0;
};
var getArrayIndexByValue = function getArrayIndexByValue(arr, value) {
if (utils.type(arr) === 'array') {
var valueType = utils.type(value);
if (valueType === 'object') {
var i = 0,
len = arr.length,
item;
for (; i < len; i++) {
item = arr[i];
var isEqual = false;
for (var key in value) {
if (value.hasOwnProperty(key)) {
isEqual = item[key] === value[key];
if (!isEqual) break;
}
}
if (isEqual) {
return i;
}
}
return -1;
} else {
return arr.indexOf(value);
}
}
};
var moveArrayItemUp = function moveArrayItemUp(arr, index) {
if (utils.type(arr) === 'array') {
index = parseArrayIndex(index);
var currItem = arr[index];
if (index > 0) {
arr[index] = arr[index - 1];
arr[index - 1] = currItem;
}
}
};
var moveArrayItemDown = function moveArrayItemDown(arr, index) {
if (utils.type(arr) === 'array') {
index = parseArrayIndex(index);
var currItem = arr[index];
if (index < arr.length - 1) {
arr[index] = arr[index + 1];
arr[index + 1] = currItem;
}
}
};
var spreadArray = function spreadArray(arr, begin, infilling, simpleInfilling, count) {
var deleted = [];
if (utils.type(arr) === 'array') {
var infillingType = utils.type(infilling);
if (simpleInfilling === true) {
splice.apply(arr, [begin, 0].concat(createArray(parseInt(count) || 1, infilling)));
} else if (infillingType === 'array') {
splice.apply(arr, [begin, 0].concat(infilling));
} else if (infillingType === 'number') {
if (infilling > 0) {
splice.apply(arr, [begin, 0].concat(createArray(infilling)));
} else if (infilling < 0) {
deleted = splice.apply(arr, [begin, Math.abs(infilling)]);
}
}
}
return deleted;
};
var spread2dArrayRow = function spread2dArrayRow(arr, begin, rows, simpleInfilling, count) {
var deleted = [],
rowsType = utils.type(rows);
if (is2dArray(arr)) {
var colCount = arr[0].length;
if (simpleInfilling === true) {
spreadArray(arr, begin, createArray(colCount, rows), true, count);
} else if (rowsType === 'number') {
if (rows > 0) {
spreadArray(arr, begin, create2dArray(rows, colCount));
} else if (rows < 0) {
deleted = spreadArray(arr, begin, rows);
}
} else if (rowsType === 'array') {
spreadArray(arr, begin, rows);
}
}
return deleted;
};
var spread2dArrayCol = function spread2dArrayCol(arr, begin, cols, simpleInfilling, count) {
var deleted = [],
deletedCol,
colsType = utils.type(cols);
if (is2dArray(arr)) {
var rowCount = arr.length,
i = 0;
if (simpleInfilling === true) {
for (; i < rowCount; i++) {
spreadArray(arr[i], begin, cols, true, count);
}
} else if (colsType === 'number') {
for (; i < rowCount; i++) {
deletedCol = spreadArray(arr[i], begin, cols);
if (deletedCol.length) {
deleted.push(deletedCol);
}
}
} else if (colsType === 'array') {
for (; i < rowCount; i++) {
spreadArray(arr[i], begin, cols[i]);
}
}
}
return deleted;
};
module.exports = {
is2dArray: is2dArray,
createArray: createArray,
create2dArray: create2dArray,
parseArrayIndex: parseArrayIndex,
getArrayIndexByValue: getArrayIndexByValue,
moveArrayItemUp: moveArrayItemUp,
moveArrayItemDown: moveArrayItemDown,
spreadArray: spreadArray,
spread2dArrayRow: spread2dArrayRow,
spread2dArrayCol: spread2dArrayCol
};