mathball
Version:
A JavaScript library for Competitive Programming
82 lines (73 loc) • 2.12 kB
JavaScript
;
var validate = require('../validation/count');
var deepCompare = function deepCompare(var1, var2) {
if ((typeof var1 === "string" || typeof var1 === "number") && (typeof var2 === "string" || typeof var2 === "number")) {
return var1 === var2;
} else if (Array.isArray(var1) && Array.isArray(var2)) {
return var1.filter(function (val) {
return var2.includes(val);
}).length === var1.length && var1.length === var2.length;
} else {
for (var ele in var1) {
if (var1.hasOwnProperty(ele) !== var2.hasOwnProperty(ele)) {
return false;
} else {
if (!deepCompare(var1[ele], var2[ele])) {
return false;
}
}
}
}
return true;
};
/**
* Find the occurance count of a phrase
* @param {string} str
* @param {string} occurance
*/
var findStroccurance = function findStroccurance(str, occurance) {
var count = 0;
var flag = -1;
do {
flag = str.indexOf(occurance, flag + 1);
if (flag !== -1) {
count++;
}
} while (flag !== -1);
return count;
};
/**
* Find the occurance count of a phrase
* @param {object} obj
* @param {string|number|object} occurance
*/
var findObjOccurance = function findObjOccurance(obj, occurance) {
var count = 0;
var keyVals = Object.keys(obj);
for (var i = 0; i < keyVals.length; i++) {
if (deepCompare(occurance, obj[keyVals[i]])) {
//obj[keyVals[i]] === occurance
count++;
}
}
return count;
};
/**
* Frequency
*
* `count()` accepts two arguments and return the occurance of second argument in first
* @param {string|number|string[]|number[]|object} arg - Accepts either a String or an Array
* @param {string|number|object} occurance - The phrase or array item you want to find
*/
module.exports = function (arg, occurance) {
validate(arg, 'count');
if (arg && arg.constructor === Array) {
return arg = arg.filter(function (val) {
return val === occurance;
}).length;
} else if (arg.constructor === Object) {
return findObjOccurance(arg, occurance);
} else {
return findStroccurance(arg, occurance);
}
};