Javascript Internet Explorer 的 findIndex() 方法问题

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/37698996/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-23 20:39:26  来源:igfitidea点击:

findIndex() method issue with internet explorer

javascriptperlunit-testingselenium-webdriverinternet-explorer-11

提问by Chaoui05

I am doing some tests with differents browsers using the Selenium::Remote::Drivermodule.

我正在使用该Selenium::Remote::Driver模块对不同的浏览器进行一些测试。

I would like to check if I find some item in my web site list, list from a framework JavaScript (which creates grids). For this case I have to use JavaScript snippet allowed by Selenium::Remote::Driver.

我想检查是否在我的网站列表中找到了一些项目,来自框架 JavaScript(创建网格)的列表。对于这种情况,我必须使用Selenium::Remote::Driver.

I wrote the following code

我写了以下代码

$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);

It works fine with Chrome and Firefox but not with Internet Explorer because the findIndexmethod is only supported by version 12 and following. For some reason I have to use version 11.

它适用于 Chrome 和 Firefox,但不适用于 Internet Explorer,因为该findIndex方法仅受版本 12 及以下版本支持。出于某种原因,我必须使用版本 11。

What can I do differently to get an index from every browser?

为了从每个浏览器获取索引,我可以做些什么不同的事情?

回答by T.J. Crowder

So my question is how can i do differently to get my index for every browser ?

所以我的问题是我如何才能以不同的方式获取每个浏览器的索引?

You have at least three options:

你至少有三个选择:

  1. Shim Array#findIndex; MDNhas a shim/polyfill you can use.

  2. Use something else that IE11 has, such as Array#some(which even IE9 has):

    var index = -1;
    items.some(function(el, i) {
        if (el.name == paramProgramName) {
            index = i;
            return true;
        }
    });
    
  3. Use something else that even IE8 has, such as for:

    var index = -1;
    for (var i = 0; i < items.length; ++i) {
        if (items[i].name == paramProgramName) {
            index = i;
            break;
        }
    }
    
  1. 垫片Array#findIndex; MDN有一个你可以使用的 shim/polyfill。

  2. 使用 IE11 拥有的其他东西,例如Array#some(甚至 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;
        }
    }
    

回答by Hendra SYP

you can use http://underscorejs.org/,

你可以使用http://underscorejs.org/

how to use:

如何使用:

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

回答by Shivank Kaul

A better way:

更好的方法:

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;
}

Usage:

用法:

findArrayIndex(cachedAnnouncementsArray, function(o){return o.ID == 17;}); 

回答by Mohammed

Another way:

其它的办法:

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]
);