Skip to content

Instantly share code, notes, and snippets.

@evanleck
Created September 3, 2013 00:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save evanleck/6418503 to your computer and use it in GitHub Desktop.
Save evanleck/6418503 to your computer and use it in GitHub Desktop.
Array.prototype.map shim for non-compliant browsers. Converted from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map.
# Production steps of ECMA-262, Edition 5, 15.4.4.19
# Reference: http://es5.github.com/#x15.4.4.19
# from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map
unless Array::map
Array::map = (callback, thisArg) ->
T = undefined
A = undefined
k = undefined
throw new TypeError(" this is null or not defined") unless this?
# 1. Let O be the result of calling ToObject passing the |this| value as the argument.
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).
len = O.length >>> 0
# 4. If IsCallable(callback) is false, throw a TypeError exception.
# See: http://es5.github.com/#x9.11
throw new TypeError(callback + " is not a function") if typeof callback isnt "function"
# 5. If thisArg was supplied, let T be thisArg; else let T be undefined.
T = thisArg if 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
kValue = undefined
mappedValue = undefined
# 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 of 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
A
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment