maael/node-data-preprocessing

View on GitHub
lib/cleanse.js

Summary

Maintainability
C
1 day
Test Coverage
var bigInt = require('big-integer');
var cleanse = function(options, data) {
    options = options || {};
    options.formats = options.formats || [];
    options.ranges = options.ranges || [];
    var dataLength = data[0].length,
        rowsToRemove = [];
    for(var i = 0; i < data.length; i++) {
        for(var j = 0; j < dataLength; j++) {
            if(typeof(data[i][j]) !== 'undefined' && (rowsToRemove.indexOf(j) === -1)) {
                if(!validate(data[i][j], options.formats[i], options.ranges[i])) {
                    rowsToRemove.push(j);
                }
            }
        }
    }
    for(var i = 0; i < rowsToRemove.length; i++) {
        data = removeRow(rowsToRemove[i] - i, data);
    }
    return data;
};

function validate(value, format, range) {
    var typeCheck = (typeof(value) === format),
        NaNCheck = (value === value),
        rangeCheck = validateRange(value, range);
    return (typeCheck && NaNCheck && rangeCheck);
}

function validateRange(value, range) {
    var check = true;
    var validators = {
        greater: function (value, min) {
            if(typeof(value) === 'object') {
                return value.greater(min);
            } else {
                return value > min;
            }
        },
        greaterOrEqual: function (value, min) {
            if(typeof(value) === 'object') {
                return value.greaterOrEquals(min);
            } else {
                return value >= min;
            }
        },
        less: function (value, max) {
            if(typeof(value) === 'object') {
                return value.lesser(max);
            } else {
                return value < max;
            }
        },
        lessOrEqual: function (value, max) {
            if(typeof(value) === 'object') {
                return value.lesserOrEquals(max);
            } else {
                return value <= max;
            }
        },
        between: function (value, range) {
            var parts = range.split('-'),
                min = parts[0],
                max = parts[1];
            return this.greater(value, min) && this.less(value, max);
        },
        betweenOrEqual: function (value, range) {
            var parts = range.split('-'),
                min = parts[0],
                max = parts[1];
            return this.greaterOrEqual(value, min) && this.lessOrEqual(value, max);
        }
    }
    if(typeof(range) !== 'undefined') {
        for (var type in range) {
            if (range.hasOwnProperty(type)) {
                if(!validators[type](value, range[type])) {
                    check = false;
                    break;
                }
            }
        }
    }
    return check;
}

function removeRow(row, data) {
    for(var i = 0; i < data.length; i++) {
        data[i].splice(row, 1);
    }
    return data;
}

module.exports = cleanse;