You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					166 lines
				
				3.8 KiB
			
		
		
			
		
	
	
					166 lines
				
				3.8 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								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);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    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;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        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 = _;
							 |