我才知道在 IE8 中不支持数组过滤功能。 在互联网上寻求帮助后,我发现了这个 - https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/filter
这表明 IE8 可以使用上面的代码。
HTML代码:
<body>
<a href="javascript:void(0)" onclick="calculateDiff()">Calculate</a>
</body>
JS代码:
function calculateDiff() {
var arr1 = new Array(1, 2, 3);
var arr2 = new Array(3, 4, 5);
var res = arr1.diff(arr2);
alert(res);
}
Array.prototype.diff = function(a) {
if(!Array.prototype.filter) {
alert("not supported");
Array.prototype.filter = function(fun) {
"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;
};
}
else {
alert("supported");
return this.filter(function(i) {
return !(a.indexOf(i) > -1);
});
}
}
我已经在这个 fiddle 中实现了解决方案 - http://jsfiddle.net/7LFMA/
代码有什么问题?为什么它不起作用?
最佳答案
第一次运行diff
时,它只会提示“不支持”
,安装filter
polyfill但是做没什么。它只是返回 undefined
,而不是像它应该做的那样 diffing。
删除 else
,或者最好只是将 filter
安装移到 diff
函数之外 - 它不是它的一部分(例如,在关闭方面,尽管现代引擎会关心这一点)。
此外,IE8 不支持indexOf
方法,您需要输入this compat shim。
if (!Array.prototype.indexOf)
Array.prototype.indexOf = function (searchElement) {…};
if (!Array.prototype.filter)
Array.prototype.filter = function(fun) {…};
Array.prototype.diff = function(a) {
return this.filter(function(i) {
return !(a.indexOf(i) > -1);
});
};
function calculateDiff() {
var arr1 = new Array(1, 2, 3);
var arr2 = new Array(3, 4, 5);
var res = arr1.diff(arr2);
alert(res);
}
关于javascript - IE8 array filter() 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15566880/