| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- const {toString} = Object.prototype;
- const escapeHtmlRegex = /["&<>]/;
- const _ = {
- each: function each(obj, cb) {
- if (obj) {
- if (Array.isArray(obj)) {
- obj.forEach(cb);
- } else {
- Object.keys(obj).forEach(key => {
- cb(obj[key], key);
- });
- }
- }
- },
- some: function some(obj, cb) {
- if (obj) {
- if (Array.isArray(obj)) {
- return obj.some(cb);
- }
- return Object.keys(obj).some(key => cb(obj[key], key));
- }
- return false;
- },
- every: function every(obj, cb) {
- if (obj) {
- if (Array.isArray(obj)) {
- return obj.every(cb);
- }
- return Object.keys(obj).every(key => cb(obj[key], key));
- }
- return true;
- },
- map: function map(obj, cb) {
- if (obj) {
- if (Array.isArray(obj)) {
- return obj.map(cb);
- }
- return Object.keys(obj).map(key => cb(obj[key], key));
- }
- return [];
- },
- keyBy(a, p) {
- return a.reduce((o, v) => {
- o[v[p]] = v;
- return o;
- }, {});
- },
- isEqual: function isEqual(a, b) {
- const aType = typeof a;
- const bType = typeof b;
- const aArray = Array.isArray(a);
- const bArray = Array.isArray(b);
- let keys;
- if (aType !== bType) {
- return false;
- }
- switch (typeof a) {
- case 'object':
- if (aArray || bArray) {
- if (aArray && bArray) {
- return (
- a.length === b.length &&
- a.every((aValue, index) => {
- const bValue = b[index];
- return _.isEqual(aValue, bValue);
- })
- );
- }
- return false;
- }
- if (a === null || b === null) {
- return a === b;
- }
- // Compare object keys and values
- keys = Object.keys(a);
- if (Object.keys(b).length !== keys.length) {
- return false;
- }
- for (const key of keys) {
- if (!b.hasOwnProperty(key)) {
- return false;
- }
- }
- return _.every(a, (aValue, key) => {
- const bValue = b[key];
- return _.isEqual(aValue, bValue);
- });
- default:
- return a === b;
- }
- },
- escapeHtml(html) {
- const regexResult = escapeHtmlRegex.exec(html);
- if (!regexResult) return html;
- let result = '';
- let escape = '';
- let lastIndex = 0;
- let i = regexResult.index;
- for (; i < html.length; i++) {
- switch (html.charAt(i)) {
- case '"':
- escape = '"';
- break;
- case '&':
- escape = '&';
- break;
- case '\'':
- escape = ''';
- break;
- case '<':
- escape = '<';
- break;
- case '>':
- escape = '>';
- break;
- default:
- continue;
- }
- if (lastIndex !== i) result += html.substring(lastIndex, i);
- lastIndex = i + 1;
- result += escape;
- }
- if (lastIndex !== i) return result + html.substring(lastIndex, i);
- return result;
- },
- strcmp(a, b) {
- if (a < b) return -1;
- if (a > b) return 1;
- return 0;
- },
- isUndefined(val) {
- return toString.call(val) === '[object Undefined]';
- },
- isObject(val) {
- return toString.call(val) === '[object Object]';
- },
- deepMerge() {
- const target = arguments[0] || {};
- const {length} = arguments;
- // eslint-disable-next-line one-var
- let src, clone, copyIsArray;
- function assignValue(val, key) {
- src = target[key];
- copyIsArray = Array.isArray(val);
- if (_.isObject(val) || copyIsArray) {
- if (copyIsArray) {
- copyIsArray = false;
- clone = src && Array.isArray(src) ? src : [];
- } else {
- clone = src && _.isObject(src) ? src : {};
- }
- target[key] = _.deepMerge(clone, val);
- } else if (!_.isUndefined(val)) {
- target[key] = val;
- }
- }
- for (let i = 0; i < length; i++) {
- _.each(arguments[i], assignValue);
- }
- return target;
- },
- };
- module.exports = _;
|