0

IE не поддерживает методы includes для массивов и строк

11

Я работаю над проектом и разрабатываю JavaScript-фреймворк. Исходный код содержит около 700 строк, поэтому я вставил лишь одну строку. Метод includes не работает в Internet Explorer. Есть ли решение этой проблемы?

var row_cells = tbl_row.match(/<td[\s\S]*?<\/td>/g);

row.Cells = new Array();
if (onRowBindFuncText != null) { /* Функция объявлена, работает быстрее */

    var cellCount = 0;
    for (i = 0; i < row_cells.length; i++) {

        var cell = new Cell();
        $.each(this, function (k, v) {

            if ((row_cells[i]+"").includes("#Eval(" + k + ")")) {

                cell.Keys.push(new Key(k,v));

...Код продолжается.

5 ответ(ов)

0

@Infer-on дал отличный ответ, но у него есть проблема в специфической ситуации. Если вы используете цикл for-in, он будет возвращать метод "includes", который вы добавили.

Вот другой полифилл:

if (!Array.prototype.includes) {
  Object.defineProperty(Array.prototype, "includes", {
    enumerable: false,
    value: function(obj) {
        var newArr = this.filter(function(el) {
          return el == obj;
        });
        return newArr.length > 0;
      }
  });
}

Этот полифилл добавляет метод includes в прототип массива, но делает его не перечисляемым, что решает проблему с циклом for-in. Теперь, если вам нужно проверить наличие элемента в массиве, метод includes будет корректно работать, не попадая в итерацию при использовании for-in.

0

Вы можете просто использовать .search() > -1, что будет вести себя аналогично. Документацию можно посмотреть здесь.

Ваш код можно переписать так:

if ((row_cells[i] + "").search("#Eval(" + k + ")") > -1) {

Таким образом, проверка наличия подстроки будет работать корректно, возвращая индекс вхождения или -1, если подстрока не найдена.

0

Этот выбранный ответ относится к строкам. Если вы ищете метод 'includes' для массивов, то я решил свою проблему в проекте Angular, добавив следующее в файл polyfills.ts:

import 'core-js/es7/array';
0

Этот код является полифиллом для TypeScript-проектов. Он был заимствован с https://developer.mozilla.org/nl/docs/Web/JavaScript/Reference/Global_Objects/Array/includes и модифицирован для корректной работы с TypeScript:

if (!Array.prototype.includes) {
    Object.defineProperty(Array.prototype, 'includes', {
        value: function(searchElement: any, fromIndex?: number): boolean {
            if (this == null) {
                throw new TypeError('"this" is null or not defined');
            }

            const o = Object(this);
            const len = o.length >>> 0;

            if (len === 0) {
                return false;
            }

            const n = fromIndex | 0;
            let k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);

            while (k < len) {
                if (o[k] === searchElement) {
                    return true;
                }
                k++;
            }
            return false;
        }
    });
}

Этот полифилл добавляет метод includes в прототип массива, если он еще не поддерживается в текущей среде выполнения JavaScript. Метод проверяет, содержится ли определенный элемент в массиве, и возвращает true или false. Оператор >>> используется для получения длины массива в виде беззнакового целого числа. Убедитесь, что вы используете его в проектах, где поддержка данного метода может отсутствовать.

0

Ваш код проверяет, содержит ли строка fullString подстроку partString. Используя метод indexOf, вы можете определить, присутствует ли partString в fullString. Если indexOf возвращает значение, большее или равное нулю, это означает, что подстрока найдена, и условие вернёт true. В противном случае, если indexOf возвращает -1, подстрока отсутствует, и условие вернёт false.

Вот ваш код на русском:

if (fullString.indexOf("partString") >= 0) {
    // true - подстрока найдена
} else {
    // false - подстрока отсутствует
}

Вместо indexOf в современных браузерах также можно использовать метод includes, который более читаем и возвращает логическое значение. Пример использования:

if (fullString.includes("partString")) {
    // true - подстрока найдена
} else {
    // false - подстрока отсутствует
}

Этот вариант является более предпочтительным, так как он проще для восприятия.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь