Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

array.map function not supported in IE8 standards?

I don't have IE8 so I am testing IE8 from within IE10. When I switch to "IE8 standards" for document mode, the javascript map function of an array object gives a javascript error: Object doesn't support property or method 'map'

but when I switch to "Standards" for document mode, there's no error. Which mode should I test under?

If IE8 doesn't support the map function, is there a way to emulate it?

like image 933
Tony_Henrich Avatar asked Aug 29 '13 01:08

Tony_Henrich


People also ask

Can we use map on array in JavaScript?

JavaScript | Array map() MethodThe map() method in JavaScript creates an array by calling a specific function on each element present in the parent array. It is a non-mutating method. Generally map() method is used to iterate over an array and calling function on every element of array.

What is array map function?

Definition and Usage. map() creates a new array from calling a function for every array element. map() calls a function once for each element in an array. map() does not execute the function for empty elements. map() does not change the original array.

Does IE support map?

In order to free up resources to deliver customer-requested features available to modern browsers, Google Maps Platform is ending support for Internet Explorer 11. Microsoft ended support for IE11 in 2021 and encouraged migration to Microsoft Edge.

Does map function work on strings?

Map() Function in Golang is used to return a copy of the string given string with all its characters modified according to the mapping function.


2 Answers

IE8 doesn't support ES5 array methods.

You can either use jQuery's $.map(), or underscore's _.map().


If you're not using any one of those libraries, you can use this polyfill on MDN.

like image 115
Joseph Silber Avatar answered Nov 15 '22 15:11

Joseph Silber


It's not supported, but MDN provides a shim very close to the specification:

// 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;
  };      
}
like image 29
bfavaretto Avatar answered Nov 15 '22 17:11

bfavaretto