forked from sheetjs/sheetjs
		
	
		
			
	
	
		
			146 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			146 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | if (!Object.keys) { | ||
|  |   Object.keys = (function () { | ||
|  |     var hasOwnProperty = Object.prototype.hasOwnProperty, | ||
|  |         hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'), | ||
|  |         dontEnums = [ | ||
|  |           'toString', | ||
|  |           'toLocaleString', | ||
|  |           'valueOf', | ||
|  |           'hasOwnProperty', | ||
|  |           'isPrototypeOf', | ||
|  |           'propertyIsEnumerable', | ||
|  |           'constructor' | ||
|  |         ], | ||
|  |         dontEnumsLength = dontEnums.length; | ||
|  |   | ||
|  |     return function (obj) { | ||
|  |       if (typeof obj !== 'object' && typeof obj !== 'function' || obj === null) throw new TypeError('Object.keys called on non-object'); | ||
|  |   | ||
|  |       var result = []; | ||
|  |   | ||
|  |       for (var prop in obj) { | ||
|  |         if (hasOwnProperty.call(obj, prop)) result.push(prop); | ||
|  |       } | ||
|  |   | ||
|  |       if (hasDontEnumBug) { | ||
|  |         for (var i=0; i < dontEnumsLength; i++) { | ||
|  |           if (hasOwnProperty.call(obj, dontEnums[i])) result.push(dontEnums[i]); | ||
|  |         } | ||
|  |       } | ||
|  |       return result; | ||
|  |     }; | ||
|  |   })(); | ||
|  | } | ||
|  | 
 | ||
|  | if (!Array.prototype.filter) | ||
|  | { | ||
|  |   Array.prototype.filter = function(fun /*, thisp */) | ||
|  |   { | ||
|  |     "use strict"; | ||
|  |   | ||
|  |     if (this == null) | ||
|  |       throw new TypeError(); | ||
|  |   | ||
|  |     var t = Object(this); | ||
|  |     var len = t.length >>> 0; | ||
|  |     if (typeof fun != "function") | ||
|  |       throw new TypeError(); | ||
|  |   | ||
|  |     var res = []; | ||
|  |     var thisp = arguments[1]; | ||
|  |     for (var i = 0; i < len; i++) | ||
|  |     { | ||
|  |       if (i in t) | ||
|  |       { | ||
|  |         var val = t[i]; // in case fun mutates this
 | ||
|  |         if (fun.call(thisp, val, i, t)) | ||
|  |           res.push(val); | ||
|  |       } | ||
|  |     } | ||
|  |   | ||
|  |     return res; | ||
|  |   }; | ||
|  | } | ||
|  | 
 | ||
|  | if ( !Array.prototype.forEach ) { | ||
|  |   Array.prototype.forEach = function(fn, scope) { | ||
|  |     for(var i = 0, len = this.length; i < len; ++i) { | ||
|  |       fn.call(scope, this[i], i, this); | ||
|  |     } | ||
|  |   }; | ||
|  | } | ||
|  | 
 | ||
|  | // Production steps of ECMA-262, Edition 5, 15.4.4.19
 | ||
|  | // Reference: http://es5.github.com/#x15.4.4.19
 | ||
|  | if (!Array.prototype.map) { | ||
|  |   Array.prototype.map = function(callback, thisArg) { | ||
|  |   | ||
|  |     var T, A, k; | ||
|  |   | ||
|  |     if (this == null) { | ||
|  |       throw new TypeError(" this is null or not defined"); | ||
|  |     } | ||
|  |   | ||
|  |     // 1. Let O be the result of calling ToObject passing the |this| value as the argument.
 | ||
|  |     var O = Object(this); | ||
|  |   | ||
|  |     // 2. Let lenValue be the result of calling the Get internal method of O with the argument "length".
 | ||
|  |     // 3. Let len be ToUint32(lenValue).
 | ||
|  |     var len = O.length >>> 0; | ||
|  |   | ||
|  |     // 4. If IsCallable(callback) is false, throw a TypeError exception.
 | ||
|  |     // See: http://es5.github.com/#x9.11
 | ||
|  |     if (typeof callback !== "function") { | ||
|  |       throw new TypeError(callback + " is not a function"); | ||
|  |     } | ||
|  |   | ||
|  |     // 5. If thisArg was supplied, let T be thisArg; else let T be undefined.
 | ||
|  |     if (thisArg) { | ||
|  |       T = thisArg; | ||
|  |     } | ||
|  |   | ||
|  |     // 6. Let A be a new array created as if by the expression new Array(len) where Array is
 | ||
|  |     // the standard built-in constructor with that name and len is the value of len.
 | ||
|  |     A = new Array(len); | ||
|  |   | ||
|  |     // 7. Let k be 0
 | ||
|  |     k = 0; | ||
|  |   | ||
|  |     // 8. Repeat, while k < len
 | ||
|  |     while(k < len) { | ||
|  |   | ||
|  |       var kValue, mappedValue; | ||
|  |   | ||
|  |       // a. Let Pk be ToString(k).
 | ||
|  |       //   This is implicit for LHS operands of the in operator
 | ||
|  |       // b. Let kPresent be the result of calling the HasProperty internal method of O with argument Pk.
 | ||
|  |       //   This step can be combined with c
 | ||
|  |       // c. If kPresent is true, then
 | ||
|  |       if (k in O) { | ||
|  |   | ||
|  |         // i. Let kValue be the result of calling the Get internal method of O with argument Pk.
 | ||
|  |         kValue = O[ k ]; | ||
|  |   | ||
|  |         // ii. Let mappedValue be the result of calling the Call internal method of callback
 | ||
|  |         // with T as the this value and argument list containing kValue, k, and O.
 | ||
|  |         mappedValue = callback.call(T, kValue, k, O); | ||
|  |   | ||
|  |         // iii. Call the DefineOwnProperty internal method of A with arguments
 | ||
|  |         // Pk, Property Descriptor {Value: mappedValue, : true, Enumerable: true, Configurable: true},
 | ||
|  |         // and false.
 | ||
|  |   | ||
|  |         // In browsers that support Object.defineProperty, use the following:
 | ||
|  |         // Object.defineProperty(A, Pk, { value: mappedValue, writable: true, enumerable: true, configurable: true });
 | ||
|  |   | ||
|  |         // For best browser support, use the following:
 | ||
|  |         A[ k ] = mappedValue; | ||
|  |       } | ||
|  |       // d. Increase k by 1.
 | ||
|  |       k++; | ||
|  |     } | ||
|  |   | ||
|  |     // 9. return A
 | ||
|  |     return A; | ||
|  |   };       | ||
|  | } |