Object.includes не является функцией в старом Chrome

Я тестирую WebView на разных устройствах. В старой версии (WebView в com.com.com (39.0.0.0)) эта функция не работает:

var obj = $.parseJSON( data );
    console.log(obj);
    objectManager.setFilter(function(geoObject) { 
        return obj.includes(geoObject.id);   <---- 1839 Error
    });

Журналы:

VM203 cmap-ya-android.js:1837 ["25", "59", "63"]
VM203 cmap-ya-android.js:1839 Uncaught TypeError: undefined is not a function
VM203 cmap-ya-android.js:1839 (anonymous function)
......

В новом Chrome все ОК: WebView в com.com.com (69.0.3497.100)

Этот метод фильтрует отображение маркеров на карте согласно документации:

https://tech.yandex.com.tr/maps/jsapi/doc/2.1/ref/reference/ObjectManager-docpage/#method_detail__setFilter-param-filterFunction и https://yandex.ru/blog/mapsapi/setfilter-peredat-massiv-dannykh

Подскажите, как можно адаптировать Object.include для старых устройств? (Или создайте фильтр, который будет работать во всех версиях)


person Alexandr    schedule 05.12.2019    source источник
comment
На самом деле это Array.includes. Вы должны включить полифиллы.   -  person karthick    schedule 06.12.2019


Ответы (2)


Согласно https://caniuse.com/#feat=array-includes, старые браузеры не поддерживает Array.prototype.includes. Пожалуйста, перепишите код с помощью indexOf или используйте для этого полифилл.

здесь вы можете добиться того же, используя

var obj = $.parseJSON( data );
console.log(obj);
objectManager.setFilter(function(geoObject) { 
    return obj.indexOf(geoObject.id) > -1;  
});
person Pranav Ramachandran    schedule 05.12.2019
comment
Спасибо Это простое и оптимальное решение для одноразового использования. - person Alexandr; 06.12.2019

Я предполагаю, что ваша переменная obj на самом деле является массивом, как показано в первой строке ваших журналов. Это означает, что вы используете Array.includes(). вместо Object.includes. Вы можете поддерживать старые браузеры, включив этот полифилл из документации Mozilla JS в вашем проекте. Это добавит реализацию для Array.includes, если она еще не существует.

Если вам нужна поддержка более новой функции браузера в старых браузерах, вы всегда можете выполнить поиск polyfills< /а>.


На случай, если ссылка с полифиллом когда-нибудь будет мертва, вот код с этой страницы:

// https://tc39.github.io/ecma262/#sec-array.prototype.includes
if (!Array.prototype.includes) {
  Object.defineProperty(Array.prototype, 'includes', {
    value: function(searchElement, fromIndex) {

      // 1. Let O be ? ToObject(this value).
      if (this == null) {
        throw new TypeError('"this" is null or not defined');
      }

      var o = Object(this);

      // 2. Let len be ? ToLength(? Get(O, "length")).
      var len = o.length >>> 0;

      // 3. If len is 0, return false.
      if (len === 0) {
        return false;
      }

      // 4. Let n be ? ToInteger(fromIndex).
      //    (If fromIndex is undefined, this step produces the value 0.)
      var n = fromIndex | 0;

      // 5. If n ≥ 0, then
      //  a. Let k be n.
      // 6. Else n < 0,
      //  a. Let k be len + n.
      //  b. If k < 0, let k be 0.
      var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);

      // 7. Repeat, while k < len
      while (k < len) {
        // a. Let elementK be the result of ? Get(O, ! ToString(k)).
        // b. If SameValueZero(searchElement, elementK) is true, return true.
        // c. Increase k by 1.
        // NOTE: === provides the correct "SameValueZero" comparison needed here.
        if (o[k] === searchElement) {
          return true;
        }
        k++;
      }

      // 8. Return false
      return false;
    }
  });
}
person BenjaVR    schedule 05.12.2019
comment
Спасибо за предложенное решение. Работает, но думаю ради разового использования в моем случае лучше применить предложенный @Pranav Ramachandran - person Alexandr; 06.12.2019