Проблема с методом findIndex () в Internet Explorer

Я провожу несколько тестов с разными браузерами, используя модуль Selenium::Remote::Driver.

Я хотел бы проверить, нахожу ли я какой-либо элемент в списке своего веб-сайта, список из фреймворка JavaScript (который создает сетки). В этом случае я должен использовать фрагмент JavaScript, разрешенный Selenium::Remote::Driver.

Я написал следующий код

$script = q{

      var paramProgramName = arguments[0];

      var list  = $('#c-list').dxList('instance');
      var items = list.option('items');
      var index = items.findIndex(function(el){ return el.name == paramProgramName; });

      list.selectItem(index);

      return ;
};

$driver->execute_script($script, $programName);

Он отлично работает с Chrome и Firefox, но не с Internet Explorer, потому что метод findIndex поддерживается только в версии 12 и ниже. Почему-то приходится использовать версию 11.

Что я могу сделать по-разному, чтобы получить индекс для каждого браузера?


person Chaoui05    schedule 08.06.2016    source источник


Ответы (4)


Итак, мой вопрос: как я могу по-разному получить индекс для каждого браузера?

У вас есть как минимум три варианта:

  1. Прокладка Array#findIndex; MDN имеет прокладку / полифил. можешь использовать.

  2. Используйте что-то еще, что есть в IE11, например Array#some < / a> (который есть даже в IE9):

    var index = -1;
    items.some(function(el, i) {
        if (el.name == paramProgramName) {
            index = i;
            return true;
        }
    });
    
  3. Используйте что-нибудь еще, что есть даже в IE8, например for:

    var index = -1;
    for (var i = 0; i < items.length; ++i) {
        if (items[i].name == paramProgramName) {
            index = i;
            break;
        }
    }
    
person T.J. Crowder    schedule 08.06.2016

вы можете использовать http://underscorejs.org/,

как использовать:

var index = _.findIndex(objects, function(item){
return item.name == programName;
});
person CuheGuevara    schedule 30.08.2018

Лучший способ:

var findArrayIndex = function (array, predicateFunction) {
    var length = array == null ? 0 : array.length;
    if (!length) {
        return -1;
    }
    var index = -1;
    for (var i = 0; i < array.length; ++i) {
        if(predicateFunction(array[i])) {
            index = i;
            break;
        }
    }
    return index;
}

Использование:

findArrayIndex(cachedAnnouncementsArray, function(o){return o.ID == 17;}); 
person Shivank Kaul    schedule 11.01.2018
comment
Почему это лучшая функция, чем та, которая утверждена как правильный ответ? Не могли бы вы объяснить? Я считаю это чрезмерно запутанным и сложным с predicateFunction. - person Dimitris Damilos; 16.03.2018
comment
Я искал замену lodash _.findIndex. Работал у меня .. - person zingh; 09.11.2019
comment
@DimitrisDamilos и те, кто поддерживает его комментарий - на самом деле это достойная и полезная функция - в основном это упрощенная перезапись / полифил Array.prototype.findIndex, поддерживаемый современными браузерами - посмотрите на эту ссылку, и вы увидите, что использование такое же, как здесь. Однако вместо того, чтобы вызывать второй параметр predicateFunction, на самом деле он должен называться просто callback, чтобы он соответствовал другим встроенным функциям JavaScript. - person jbyrd; 24.06.2020

Другой путь:

var objects = [
  { 'key' : 1, 'name' : 'ABC' },
  { 'key' : 2, 'name' : 'QLP' },
  { 'key' : 3, 'name' : 'XYZ' },
];

function filterByKey(obj) {
  if ('key' in obj) {
    return obj.key === 'some_value';
  }
}

var index = objects.indexOf(
  objects.filter(filterByKey)[0]
);
person Mohammed    schedule 13.06.2018