javascript - IE8 array filter() 不起作用

标签 javascript arrays internet-explorer-8 array-difference

我才知道在 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/

相关文章:

javascript - 从 fetch 返回的值未定义(promise)

Java - 将 byte[] 转换为 char[]。编码是UTF-16

java - 我的 Java 代码出现错误,但我看不出它有什么问题。帮助?

css - 奇怪的 IE8 css 问题

jquery - Bootstrap 在 IE8 上显示平板电脑版本

javascript - 检查表中的所有数据值

javascript - 带有加号的 jQuery

javascript - 如何获取输入字段中的最后一个字符/数字?

javascript - 我如何创建一个可重用的函数来为变量对象属性设置状态?

jquery - IE8 缩放图像以适合带有 ms-filter 的容器