Array.from in Internet Explorer

I have a problem with my angular app in Internet Explorer. It works everywhere without problems (Chrome, Mozilla, Edge), but is included in IE.

I analyzed with Explorer Explorer where the error occurred, and it returned that the error occurs on the following line:

myDataSet[index - 1].data = Array.from(tmp);

If this is the following error message I get:

Object does not support property or method from at Anonymous function....(etc.)

What I am doing is that I have Set() named tmp , which contains the following data:

enter image description here

Subsequently, I simply create a simple array object from this Set .

How can I solve this problem?

EDIT

Based on the recommendations, I added the following code to my application:

 if (!Array.from) { Array.from = (function () { var toStr = Object.prototype.toString; var isCallable = function (fn) { return typeof fn === 'function' || toStr.call(fn) === '[object Function]'; }; var toInteger = function (value) { var number = Number(value); if (isNaN(number)) { return 0; } if (number === 0 || !isFinite(number)) { return number; } return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number)); }; var maxSafeInteger = Math.pow(2, 53) - 1; var toLength = function (value) { var len = toInteger(value); return Math.min(Math.max(len, 0), maxSafeInteger); }; // The length property of the from method is 1. return function from(arrayLike/*, mapFn, thisArg */) { // 1. Let C be the this value. var C = this; // 2. Let items be ToObject(arrayLike). var items = Object(arrayLike); // 3. ReturnIfAbrupt(items). if (arrayLike == null) { throw new TypeError("Array.from requires an array-like object - not null or undefined"); } // 4. If mapfn is undefined, then let mapping be false. var mapFn = arguments.length > 1 ? arguments[1] : void undefined; var T; if (typeof mapFn !== 'undefined') { // 5. else // 5. a If IsCallable(mapfn) is false, throw a TypeError exception. if (!isCallable(mapFn)) { throw new TypeError('Array.from: when provided, the second argument must be a function'); } // 5. b. If thisArg was supplied, let T be thisArg; else let T be undefined. if (arguments.length > 2) { T = arguments[2]; } } // 10. Let lenValue be Get(items, "length"). // 11. Let len be ToLength(lenValue). var len = toLength(items.length); // 13. If IsConstructor(C) is true, then // 13. a. Let A be the result of calling the [[Construct]] internal method of C with an argument list containing the single item len. // 14. a. Else, Let A be ArrayCreate(len). var A = isCallable(C) ? Object(new C(len)) : new Array(len); // 16. Let k be 0. var k = 0; // 17. Repeat, while k < len… (also steps a - h) var kValue; while (k < len) { kValue = items[k]; if (mapFn) { A[k] = typeof T === 'undefined' ? mapFn(kValue, k) : mapFn.call(T, kValue, k); } else { A[k] = kValue; } k += 1; } // 18. Let putStatus be Put(A, "length", len, true). A.length = len; // 20. Return A. return A; }; }()); } 
+11
javascript arrays angularjs internet-explorer
Apr 23 '16 at 12:40
source share
3 answers

Array.from not supported in the following document modes: Quirks, Internet Explorer 6 standards, Internet Explorer 7 standards, Internet Explorer 8 standards, Internet Explorer 9 standards, Internet Explorer 10 standards, Internet Explorer 11 standards. Not supported on Windows 8.1.

Just add the code to your page ( JS code was copied from developer.mozilla.org ). It will emulate the Array.from Array.from method.

Array.from was added to the ECMA-262 standard in the 6th edition; as such, it cannot be present in other implementations of the standard. You can get around this by inserting the following code at the beginning of your scripts, allowing you to use Array.from in which they do not support it. This algorithm is exactly the same as that specified in ECMA-262, 6th edition, provided that the object and TypeError have their original values, and callback.call evaluates the initial value of Function.prototype.call. In addition, since true iterations cannot be completed, this implementation does not support the general iterations defined in the 6th edition of ECMA-262.

 if (!Array.from) { Array.from = (function () { var toStr = Object.prototype.toString; var isCallable = function (fn) { return typeof fn === 'function' || toStr.call(fn) === '[object Function]'; }; var toInteger = function (value) { var number = Number(value); if (isNaN(number)) { return 0; } if (number === 0 || !isFinite(number)) { return number; } return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number)); }; var maxSafeInteger = Math.pow(2, 53) - 1; var toLength = function (value) { var len = toInteger(value); return Math.min(Math.max(len, 0), maxSafeInteger); }; // The length property of the from method is 1. return function from(arrayLike/*, mapFn, thisArg */) { // 1. Let C be the this value. var C = this; // 2. Let items be ToObject(arrayLike). var items = Object(arrayLike); // 3. ReturnIfAbrupt(items). if (arrayLike == null) { throw new TypeError("Array.from requires an array-like object - not null or undefined"); } // 4. If mapfn is undefined, then let mapping be false. var mapFn = arguments.length > 1 ? arguments[1] : void undefined; var T; if (typeof mapFn !== 'undefined') { // 5. else // 5. a If IsCallable(mapfn) is false, throw a TypeError exception. if (!isCallable(mapFn)) { throw new TypeError('Array.from: when provided, the second argument must be a function'); } // 5. b. If thisArg was supplied, let T be thisArg; else let T be undefined. if (arguments.length > 2) { T = arguments[2]; } } // 10. Let lenValue be Get(items, "length"). // 11. Let len be ToLength(lenValue). var len = toLength(items.length); // 13. If IsConstructor(C) is true, then // 13. a. Let A be the result of calling the [[Construct]] internal method of C with an argument list containing the single item len. // 14. a. Else, Let A be ArrayCreate(len). var A = isCallable(C) ? Object(new C(len)) : new Array(len); // 16. Let k be 0. var k = 0; // 17. Repeat, while k < len… (also steps a - h) var kValue; while (k < len) { kValue = items[k]; if (mapFn) { A[k] = typeof T === 'undefined' ? mapFn(kValue, k) : mapFn.call(T, kValue, k); } else { A[k] = kValue; } k += 1; } // 18. Let putStatus be Put(A, "length", len, true). A.length = len; // 20. Return A. return A; }; }()); } 
+22
Apr 23 '16 at 12:42 on
source share
— -

While it is not supported in IE , you can use polyfill from MDN.

+4
Apr 23 '16 at 12:43 on
source share

I ran into the same problem. I looked at polyfill, and it threatens a huge amount. Here is a short solution with two lines.

The OP should basically create a simple array from its object, similar to an array. I, in my opinion, used the most efficient 2-line simple for loop (I had to make an array from the DOM nodelist arraylike object, which is applicable to the JavaScript arguments object).

In the case of OP, it might sound like this:

 var temp_array = [], length = tmp.Set.length; for (var i = 0; i < length; i++) { temp_array.push(tmp.Set[i]); } // Here you get the normal array "temp_array" containing all items // from your `tmp.Set`. 

Make it a separate function and you will get a universal solution of 3 lines for the case of IE <9.

+3
Dec 21 '16 at 11:17
source share



All Articles