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.
		
		
		
		
		
			
		
			
				
					74 lines
				
				1.8 KiB
			
		
		
			
		
	
	
					74 lines
				
				1.8 KiB
			| 
											3 years ago
										 | 'use strict'; | ||
|  | 
 | ||
|  | /** | ||
|  |  * High performance assign before node6 | ||
|  |  * @param {Object} target - target object | ||
|  |  * @param {Object | Array} objects - object assign from | ||
|  |  * @return {Object} - return target object | ||
|  |  */ | ||
|  | exports.assign = function(target, objects) { | ||
|  |   if (!Array.isArray(objects)) { | ||
|  |     objects = [ objects ]; | ||
|  |   } | ||
|  | 
 | ||
|  |   for (var i = 0; i < objects.length; i++) { | ||
|  |     var obj = objects[i]; | ||
|  |     if (obj) { | ||
|  |       var keys = Object.keys(obj); | ||
|  |       for (var j = 0; j < keys.length; j++) { | ||
|  |         var key = keys[j]; | ||
|  |         target[key] = obj[key]; | ||
|  |       } | ||
|  |     } | ||
|  |   } | ||
|  |   return target; | ||
|  | }; | ||
|  | 
 | ||
|  | exports.has = function has(obj, prop) { | ||
|  |   return Object.prototype.hasOwnProperty.call(obj, prop); | ||
|  | }; | ||
|  | 
 | ||
|  | /** | ||
|  |  * Get all enumerable and ownership of property names | ||
|  |  * @param {Object} obj - detect object | ||
|  |  * @param {Boolean} [ignoreNull] - ignore null, undefined or NaN property | ||
|  |  * @return {Array<String>} property names | ||
|  |  */ | ||
|  | exports.getOwnEnumerables = function getOwnEnumerables(obj, ignoreNull) { | ||
|  |   if (!obj || typeof obj !== 'object' || Array.isArray(obj)) { | ||
|  |     return []; | ||
|  |   } | ||
|  |   return Object.keys(obj).filter(function(key) { | ||
|  |     if (ignoreNull) { | ||
|  |       var value = obj[key]; | ||
|  |       if (value === null || value === undefined || Number.isNaN(value)) { | ||
|  |         return false; | ||
|  |       } | ||
|  |     } | ||
|  |     return exports.has(obj, key); | ||
|  |   }); | ||
|  | }; | ||
|  | 
 | ||
|  | /** | ||
|  |  * generate a real map object(clean object), no constructor, no __proto__ | ||
|  |  * @param {Object} [obj] - init object, optional | ||
|  |  * @return {Object} | ||
|  |  */ | ||
|  | exports.map = function map(obj) { | ||
|  |   var map = new EmptyObject(); | ||
|  |   if (!obj) { | ||
|  |     return map; | ||
|  |   } | ||
|  | 
 | ||
|  |   for (var key in obj) { | ||
|  |     map[key] = obj[key]; | ||
|  |   } | ||
|  |   return map; | ||
|  | }; | ||
|  | 
 | ||
|  | // faster way like `Object.create(null)` to get a 'clean' empty object
 | ||
|  | // https://github.com/nodejs/node/blob/master/lib/events.js#L5
 | ||
|  | // https://cnodejs.org/topic/571e0c445a26c4a841ecbcf1
 | ||
|  | function EmptyObject() {} | ||
|  | EmptyObject.prototype = Object.create(null); |