Array.from on the Internet Explorer
I have a problem with my angular app on the Internet Explorer. It runs everywhere without a problem (Chrome, Mozilla, Edge), but on on the IE.
I have analyzed with the Developer Explorer where the error is and it returned that the error occurs on the following line:
myDataSet[index - 1].data = Array.from(tmp);
Where this is the following error message I am getting:
Object does not support property or method from at Anonymous function....(etc.)
What I am doing there is that I have a Set()
named tmp
which contains the following data:
Afterwards I am simply creating a simple array object from this Set
.
How can I solve this problem?
EDIT
Based on the recommendations I have added the following code to my app:
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;
};
}());
}
javascript arrays angularjs internet-explorer
add a comment |
I have a problem with my angular app on the Internet Explorer. It runs everywhere without a problem (Chrome, Mozilla, Edge), but on on the IE.
I have analyzed with the Developer Explorer where the error is and it returned that the error occurs on the following line:
myDataSet[index - 1].data = Array.from(tmp);
Where this is the following error message I am getting:
Object does not support property or method from at Anonymous function....(etc.)
What I am doing there is that I have a Set()
named tmp
which contains the following data:
Afterwards I am simply creating a simple array object from this Set
.
How can I solve this problem?
EDIT
Based on the recommendations I have added the following code to my app:
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;
};
}());
}
javascript arrays angularjs internet-explorer
add a comment |
I have a problem with my angular app on the Internet Explorer. It runs everywhere without a problem (Chrome, Mozilla, Edge), but on on the IE.
I have analyzed with the Developer Explorer where the error is and it returned that the error occurs on the following line:
myDataSet[index - 1].data = Array.from(tmp);
Where this is the following error message I am getting:
Object does not support property or method from at Anonymous function....(etc.)
What I am doing there is that I have a Set()
named tmp
which contains the following data:
Afterwards I am simply creating a simple array object from this Set
.
How can I solve this problem?
EDIT
Based on the recommendations I have added the following code to my app:
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;
};
}());
}
javascript arrays angularjs internet-explorer
I have a problem with my angular app on the Internet Explorer. It runs everywhere without a problem (Chrome, Mozilla, Edge), but on on the IE.
I have analyzed with the Developer Explorer where the error is and it returned that the error occurs on the following line:
myDataSet[index - 1].data = Array.from(tmp);
Where this is the following error message I am getting:
Object does not support property or method from at Anonymous function....(etc.)
What I am doing there is that I have a Set()
named tmp
which contains the following data:
Afterwards I am simply creating a simple array object from this Set
.
How can I solve this problem?
EDIT
Based on the recommendations I have added the following code to my app:
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;
};
}());
}
javascript arrays angularjs internet-explorer
javascript arrays angularjs internet-explorer
edited Apr 23 '16 at 12:46
Robert J.
asked Apr 23 '16 at 12:40
Robert J.Robert J.
1,18011631
1,18011631
add a comment |
add a comment |
3 Answers
3
active
oldest
votes
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 in Windows 8.1.
Just add the code below to your page (JS code was copied from developer.mozilla.org). It will emulate an ES6's Array.from
method.
Array.from was added to the ECMA-262 standard in the 6th edition; as
such it may not be present in other implementations of the standard.
You can work around this by inserting the following code at the
beginning of your scripts, allowing use of Array.from in
implementations that don't natively support it. This algorithm is
exactly the one specified in ECMA-262, 6th edition, assuming Object
and TypeError have their original values and that callback.call
evaluates to the original value of Function.prototype.call. In
addition, since true iterables can not be polyfilled, this
implementation does not support generic iterables as 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;
};
}());
}
1
thank you for explaining this. Could you advise, what code to use to replace myArray.from
, please?
– Robert J.
Apr 23 '16 at 12:43
I have updated my answer. Just copy JavaScript code into your page. For example to the main JS file. And your problem will be solved!
– Ali Mamedov
Apr 23 '16 at 12:51
You may trymyDataSet[index - 1].data = Array.prototype.slice.call(tmp);
– Redu
Apr 23 '16 at 12:51
I have tried to use your line but it did not work on my end. When using Array.From I have noticed that the function has issues when I am passing aSet
to it (e.g. id does not recognize lenght of the array,mapFn
is undefined, ...)
– Robert J.
Apr 23 '16 at 13:02
@Robert J. iftmp
object does not have a length property first try inserting a length property to it and give it a correct value. If it doesn't work you have to make the tmp object iterable by inserting a [Symbol.iterator] method. (study this developer.mozilla.org/tr/docs/Web/JavaScript/Reference/…) once tmp is an iterable object then you can safely usemyDataSet[index - 1].data = Array.prototype.slice.call(tmp);
method. Could you please list thetmp
object in the question.
– Redu
Apr 23 '16 at 13:12
|
show 2 more comments
I faced the same issue. Looked at the polyfill and it is threatening huge. Here is 2 lines short solution.
The OP basically needs to create simple array from his array-like object. I used to my taste the most efficient 2 lines plain for
loop (I had to make array from HTML DOM nodelist array-like object, same applicable to JavaScript arguments
object).
For the OP's case it could sound this way:
var temp_array = ,
length = tmp.length;
for (var i = 0; i < length; i++) {
temp_array.push(tmp[i]);
}
// Here you get the normal array "temp_array" containing all items
// from your `tmp` Set.
Make it separate function and you get 3 lines universal reusable solution for the IE<9 case.
Here is how the separate function may look like:
/**
* @param arr The array | array-like data structure.
* @param callback The function to process each element in the 'arr'.
* The callback signature and usage is assumed similar to the
* native JS 'forEach' callback argument usage.
*/
function customEach(arr, callback) {
'use strict';
var l = arr.length;
for (var i = 0; i < l; i++) {
callback(arr[i], i, arr);
}
};
PS: here is the relevant description for forEach callback to see how to use the customEach
callback.
add a comment |
While it's not supported on IE, you may use the polyfill from MDN.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f36810940%2farray-from-on-the-internet-explorer%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
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 in Windows 8.1.
Just add the code below to your page (JS code was copied from developer.mozilla.org). It will emulate an ES6's Array.from
method.
Array.from was added to the ECMA-262 standard in the 6th edition; as
such it may not be present in other implementations of the standard.
You can work around this by inserting the following code at the
beginning of your scripts, allowing use of Array.from in
implementations that don't natively support it. This algorithm is
exactly the one specified in ECMA-262, 6th edition, assuming Object
and TypeError have their original values and that callback.call
evaluates to the original value of Function.prototype.call. In
addition, since true iterables can not be polyfilled, this
implementation does not support generic iterables as 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;
};
}());
}
1
thank you for explaining this. Could you advise, what code to use to replace myArray.from
, please?
– Robert J.
Apr 23 '16 at 12:43
I have updated my answer. Just copy JavaScript code into your page. For example to the main JS file. And your problem will be solved!
– Ali Mamedov
Apr 23 '16 at 12:51
You may trymyDataSet[index - 1].data = Array.prototype.slice.call(tmp);
– Redu
Apr 23 '16 at 12:51
I have tried to use your line but it did not work on my end. When using Array.From I have noticed that the function has issues when I am passing aSet
to it (e.g. id does not recognize lenght of the array,mapFn
is undefined, ...)
– Robert J.
Apr 23 '16 at 13:02
@Robert J. iftmp
object does not have a length property first try inserting a length property to it and give it a correct value. If it doesn't work you have to make the tmp object iterable by inserting a [Symbol.iterator] method. (study this developer.mozilla.org/tr/docs/Web/JavaScript/Reference/…) once tmp is an iterable object then you can safely usemyDataSet[index - 1].data = Array.prototype.slice.call(tmp);
method. Could you please list thetmp
object in the question.
– Redu
Apr 23 '16 at 13:12
|
show 2 more comments
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 in Windows 8.1.
Just add the code below to your page (JS code was copied from developer.mozilla.org). It will emulate an ES6's Array.from
method.
Array.from was added to the ECMA-262 standard in the 6th edition; as
such it may not be present in other implementations of the standard.
You can work around this by inserting the following code at the
beginning of your scripts, allowing use of Array.from in
implementations that don't natively support it. This algorithm is
exactly the one specified in ECMA-262, 6th edition, assuming Object
and TypeError have their original values and that callback.call
evaluates to the original value of Function.prototype.call. In
addition, since true iterables can not be polyfilled, this
implementation does not support generic iterables as 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;
};
}());
}
1
thank you for explaining this. Could you advise, what code to use to replace myArray.from
, please?
– Robert J.
Apr 23 '16 at 12:43
I have updated my answer. Just copy JavaScript code into your page. For example to the main JS file. And your problem will be solved!
– Ali Mamedov
Apr 23 '16 at 12:51
You may trymyDataSet[index - 1].data = Array.prototype.slice.call(tmp);
– Redu
Apr 23 '16 at 12:51
I have tried to use your line but it did not work on my end. When using Array.From I have noticed that the function has issues when I am passing aSet
to it (e.g. id does not recognize lenght of the array,mapFn
is undefined, ...)
– Robert J.
Apr 23 '16 at 13:02
@Robert J. iftmp
object does not have a length property first try inserting a length property to it and give it a correct value. If it doesn't work you have to make the tmp object iterable by inserting a [Symbol.iterator] method. (study this developer.mozilla.org/tr/docs/Web/JavaScript/Reference/…) once tmp is an iterable object then you can safely usemyDataSet[index - 1].data = Array.prototype.slice.call(tmp);
method. Could you please list thetmp
object in the question.
– Redu
Apr 23 '16 at 13:12
|
show 2 more comments
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 in Windows 8.1.
Just add the code below to your page (JS code was copied from developer.mozilla.org). It will emulate an ES6's Array.from
method.
Array.from was added to the ECMA-262 standard in the 6th edition; as
such it may not be present in other implementations of the standard.
You can work around this by inserting the following code at the
beginning of your scripts, allowing use of Array.from in
implementations that don't natively support it. This algorithm is
exactly the one specified in ECMA-262, 6th edition, assuming Object
and TypeError have their original values and that callback.call
evaluates to the original value of Function.prototype.call. In
addition, since true iterables can not be polyfilled, this
implementation does not support generic iterables as 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;
};
}());
}
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 in Windows 8.1.
Just add the code below to your page (JS code was copied from developer.mozilla.org). It will emulate an ES6's Array.from
method.
Array.from was added to the ECMA-262 standard in the 6th edition; as
such it may not be present in other implementations of the standard.
You can work around this by inserting the following code at the
beginning of your scripts, allowing use of Array.from in
implementations that don't natively support it. This algorithm is
exactly the one specified in ECMA-262, 6th edition, assuming Object
and TypeError have their original values and that callback.call
evaluates to the original value of Function.prototype.call. In
addition, since true iterables can not be polyfilled, this
implementation does not support generic iterables as 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;
};
}());
}
edited Apr 23 '16 at 12:53
answered Apr 23 '16 at 12:42
Ali MamedovAli Mamedov
3,46722331
3,46722331
1
thank you for explaining this. Could you advise, what code to use to replace myArray.from
, please?
– Robert J.
Apr 23 '16 at 12:43
I have updated my answer. Just copy JavaScript code into your page. For example to the main JS file. And your problem will be solved!
– Ali Mamedov
Apr 23 '16 at 12:51
You may trymyDataSet[index - 1].data = Array.prototype.slice.call(tmp);
– Redu
Apr 23 '16 at 12:51
I have tried to use your line but it did not work on my end. When using Array.From I have noticed that the function has issues when I am passing aSet
to it (e.g. id does not recognize lenght of the array,mapFn
is undefined, ...)
– Robert J.
Apr 23 '16 at 13:02
@Robert J. iftmp
object does not have a length property first try inserting a length property to it and give it a correct value. If it doesn't work you have to make the tmp object iterable by inserting a [Symbol.iterator] method. (study this developer.mozilla.org/tr/docs/Web/JavaScript/Reference/…) once tmp is an iterable object then you can safely usemyDataSet[index - 1].data = Array.prototype.slice.call(tmp);
method. Could you please list thetmp
object in the question.
– Redu
Apr 23 '16 at 13:12
|
show 2 more comments
1
thank you for explaining this. Could you advise, what code to use to replace myArray.from
, please?
– Robert J.
Apr 23 '16 at 12:43
I have updated my answer. Just copy JavaScript code into your page. For example to the main JS file. And your problem will be solved!
– Ali Mamedov
Apr 23 '16 at 12:51
You may trymyDataSet[index - 1].data = Array.prototype.slice.call(tmp);
– Redu
Apr 23 '16 at 12:51
I have tried to use your line but it did not work on my end. When using Array.From I have noticed that the function has issues when I am passing aSet
to it (e.g. id does not recognize lenght of the array,mapFn
is undefined, ...)
– Robert J.
Apr 23 '16 at 13:02
@Robert J. iftmp
object does not have a length property first try inserting a length property to it and give it a correct value. If it doesn't work you have to make the tmp object iterable by inserting a [Symbol.iterator] method. (study this developer.mozilla.org/tr/docs/Web/JavaScript/Reference/…) once tmp is an iterable object then you can safely usemyDataSet[index - 1].data = Array.prototype.slice.call(tmp);
method. Could you please list thetmp
object in the question.
– Redu
Apr 23 '16 at 13:12
1
1
thank you for explaining this. Could you advise, what code to use to replace my
Array.from
, please?– Robert J.
Apr 23 '16 at 12:43
thank you for explaining this. Could you advise, what code to use to replace my
Array.from
, please?– Robert J.
Apr 23 '16 at 12:43
I have updated my answer. Just copy JavaScript code into your page. For example to the main JS file. And your problem will be solved!
– Ali Mamedov
Apr 23 '16 at 12:51
I have updated my answer. Just copy JavaScript code into your page. For example to the main JS file. And your problem will be solved!
– Ali Mamedov
Apr 23 '16 at 12:51
You may try
myDataSet[index - 1].data = Array.prototype.slice.call(tmp);
– Redu
Apr 23 '16 at 12:51
You may try
myDataSet[index - 1].data = Array.prototype.slice.call(tmp);
– Redu
Apr 23 '16 at 12:51
I have tried to use your line but it did not work on my end. When using Array.From I have noticed that the function has issues when I am passing a
Set
to it (e.g. id does not recognize lenght of the array, mapFn
is undefined, ...)– Robert J.
Apr 23 '16 at 13:02
I have tried to use your line but it did not work on my end. When using Array.From I have noticed that the function has issues when I am passing a
Set
to it (e.g. id does not recognize lenght of the array, mapFn
is undefined, ...)– Robert J.
Apr 23 '16 at 13:02
@Robert J. if
tmp
object does not have a length property first try inserting a length property to it and give it a correct value. If it doesn't work you have to make the tmp object iterable by inserting a [Symbol.iterator] method. (study this developer.mozilla.org/tr/docs/Web/JavaScript/Reference/…) once tmp is an iterable object then you can safely use myDataSet[index - 1].data = Array.prototype.slice.call(tmp);
method. Could you please list the tmp
object in the question.– Redu
Apr 23 '16 at 13:12
@Robert J. if
tmp
object does not have a length property first try inserting a length property to it and give it a correct value. If it doesn't work you have to make the tmp object iterable by inserting a [Symbol.iterator] method. (study this developer.mozilla.org/tr/docs/Web/JavaScript/Reference/…) once tmp is an iterable object then you can safely use myDataSet[index - 1].data = Array.prototype.slice.call(tmp);
method. Could you please list the tmp
object in the question.– Redu
Apr 23 '16 at 13:12
|
show 2 more comments
I faced the same issue. Looked at the polyfill and it is threatening huge. Here is 2 lines short solution.
The OP basically needs to create simple array from his array-like object. I used to my taste the most efficient 2 lines plain for
loop (I had to make array from HTML DOM nodelist array-like object, same applicable to JavaScript arguments
object).
For the OP's case it could sound this way:
var temp_array = ,
length = tmp.length;
for (var i = 0; i < length; i++) {
temp_array.push(tmp[i]);
}
// Here you get the normal array "temp_array" containing all items
// from your `tmp` Set.
Make it separate function and you get 3 lines universal reusable solution for the IE<9 case.
Here is how the separate function may look like:
/**
* @param arr The array | array-like data structure.
* @param callback The function to process each element in the 'arr'.
* The callback signature and usage is assumed similar to the
* native JS 'forEach' callback argument usage.
*/
function customEach(arr, callback) {
'use strict';
var l = arr.length;
for (var i = 0; i < l; i++) {
callback(arr[i], i, arr);
}
};
PS: here is the relevant description for forEach callback to see how to use the customEach
callback.
add a comment |
I faced the same issue. Looked at the polyfill and it is threatening huge. Here is 2 lines short solution.
The OP basically needs to create simple array from his array-like object. I used to my taste the most efficient 2 lines plain for
loop (I had to make array from HTML DOM nodelist array-like object, same applicable to JavaScript arguments
object).
For the OP's case it could sound this way:
var temp_array = ,
length = tmp.length;
for (var i = 0; i < length; i++) {
temp_array.push(tmp[i]);
}
// Here you get the normal array "temp_array" containing all items
// from your `tmp` Set.
Make it separate function and you get 3 lines universal reusable solution for the IE<9 case.
Here is how the separate function may look like:
/**
* @param arr The array | array-like data structure.
* @param callback The function to process each element in the 'arr'.
* The callback signature and usage is assumed similar to the
* native JS 'forEach' callback argument usage.
*/
function customEach(arr, callback) {
'use strict';
var l = arr.length;
for (var i = 0; i < l; i++) {
callback(arr[i], i, arr);
}
};
PS: here is the relevant description for forEach callback to see how to use the customEach
callback.
add a comment |
I faced the same issue. Looked at the polyfill and it is threatening huge. Here is 2 lines short solution.
The OP basically needs to create simple array from his array-like object. I used to my taste the most efficient 2 lines plain for
loop (I had to make array from HTML DOM nodelist array-like object, same applicable to JavaScript arguments
object).
For the OP's case it could sound this way:
var temp_array = ,
length = tmp.length;
for (var i = 0; i < length; i++) {
temp_array.push(tmp[i]);
}
// Here you get the normal array "temp_array" containing all items
// from your `tmp` Set.
Make it separate function and you get 3 lines universal reusable solution for the IE<9 case.
Here is how the separate function may look like:
/**
* @param arr The array | array-like data structure.
* @param callback The function to process each element in the 'arr'.
* The callback signature and usage is assumed similar to the
* native JS 'forEach' callback argument usage.
*/
function customEach(arr, callback) {
'use strict';
var l = arr.length;
for (var i = 0; i < l; i++) {
callback(arr[i], i, arr);
}
};
PS: here is the relevant description for forEach callback to see how to use the customEach
callback.
I faced the same issue. Looked at the polyfill and it is threatening huge. Here is 2 lines short solution.
The OP basically needs to create simple array from his array-like object. I used to my taste the most efficient 2 lines plain for
loop (I had to make array from HTML DOM nodelist array-like object, same applicable to JavaScript arguments
object).
For the OP's case it could sound this way:
var temp_array = ,
length = tmp.length;
for (var i = 0; i < length; i++) {
temp_array.push(tmp[i]);
}
// Here you get the normal array "temp_array" containing all items
// from your `tmp` Set.
Make it separate function and you get 3 lines universal reusable solution for the IE<9 case.
Here is how the separate function may look like:
/**
* @param arr The array | array-like data structure.
* @param callback The function to process each element in the 'arr'.
* The callback signature and usage is assumed similar to the
* native JS 'forEach' callback argument usage.
*/
function customEach(arr, callback) {
'use strict';
var l = arr.length;
for (var i = 0; i < l; i++) {
callback(arr[i], i, arr);
}
};
PS: here is the relevant description for forEach callback to see how to use the customEach
callback.
edited Nov 16 '18 at 9:38
answered Dec 21 '16 at 11:17
bob-12345bob-12345
184512
184512
add a comment |
add a comment |
While it's not supported on IE, you may use the polyfill from MDN.
add a comment |
While it's not supported on IE, you may use the polyfill from MDN.
add a comment |
While it's not supported on IE, you may use the polyfill from MDN.
While it's not supported on IE, you may use the polyfill from MDN.
answered Apr 23 '16 at 12:43
Nina ScholzNina Scholz
194k15107178
194k15107178
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f36810940%2farray-from-on-the-internet-explorer%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown