kalman-filter
Version:
Kalman filter (and Extended Kalman Filter) Multi-dimensional implementation in Javascript
47 lines (37 loc) • 1.31 kB
JavaScript
const uniq = require('./uniq.js');
const limit = 100;
/**
*Equivalent to the Object.assign method, takes several arguments and creates a new object corresponding to the assignment of the arguments
* @param {Object} args
* @param {Number} step
* @returns {Object}
*/
const deepAssign = function (args, step) {
if (step > limit) {
throw (new Error(`In deepAssign, number of recursive call (${step}) reached limit (${limit}), deepAssign is not working on self-referencing objects`));
}
const filterArguments = args.filter(arg => (arg) !== undefined && arg !== null);
const lastArgument = filterArguments[filterArguments.length - 1];
if (filterArguments.length === 1) {
return filterArguments[0];
}
if (typeof (lastArgument) !== 'object' || Array.isArray(lastArgument)) {
return lastArgument;
}
if (filterArguments.length === 0) {
return null;
}
const objectsArguments = filterArguments.filter(arg => typeof (arg) === 'object');
let keys = [];
for (const arg of objectsArguments) {
keys = keys.concat(Object.keys(arg));
}
const uniqKeys = uniq(keys);
const result = {};
for (const key of uniqKeys) {
const values = objectsArguments.map(arg => arg[key]);
result[key] = deepAssign(values, step + 1);
}
return result;
};
module.exports = ((...args) => deepAssign(args, 0));