IndexOf与_.indexOf(Underscore.js)与$ .inArray相比,在使用数组时具有更好的性能?

时间:2018-08-07 13:08:35

标签: javascript jquery underscore.js

注意:一个事件是根据复选框的选择触发的,并且有多个复选框,我需要在选中另一个复选框之前完成执行,因此速度非常重要。请提前提供帮助和感谢

1 个答案:

答案 0 :(得分:0)

jQuery的$.inArray实际上只是香草Array.indexOf的包装(存在于all现代浏览器中)

Underscore的_.indexOf更复杂,并且在某些情况下包括一些特殊处理-例如,如果数组已经排序,它将使用二进制搜索-因此在某些情况下可能会更快。

找出最快的方法是对您的真实数据进行性能测试;根据使用的数据类型,不同的算法可能更快或更慢。

(还值得考虑是否为一个包含的可能更快的功能而包含一个完整的外部库是否合理;除非您已经将该库用于其他功能,否则最好看看该库的代码是什么实际上正在做,并且只吸收您需要的部分。)

尽管如此,我很确定您在这里树错了树

  

我需要在选中另一个复选框之前完成执行

这里是一百万个项目数组上.indexOf的快速测试案例;尝试在第一个复选框仍在运行时触发第二个复选框的click事件:

let firstIsRunning = false;

// make a big random array to search through:
let bigArray = [];
for (var i = 0; i < 1000000; i++) {
  bigArray.push(Math.random())
  if (i === 500000) {
    bigArray.push("TEST") // just so we have something to match
  }
}

// run indexOf on that array:
$('#one').on('click', function() {
  firstIsRunning = true;
  console.log(bigArray.indexOf("TEST"))
  firstIsRunning = false;
})

// will log "true" if the first function is still running. (This will never happen.)
$('#two').on('click', function() {
  console.log(firstIsRunning)
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<label><input type="checkbox" id="one"> Check me first</label><br>
<label><input type="checkbox" id="two"> then me</label>

即使.indexOf实际上不是瞬时的,只要不涉及异步代码,javascript的单线程性质也意味着(使用few exceptions),第一个事件处理程序将在第二个事件处理程序之前完成。被占用了。

如果涉及异步代码 ,并且您需要确保一个操作在另一个操作开始之前完成,那么您将希望显式地将其编码(通过使第二个操作等待第一个操作)答应解决),而不是依赖于您可以找到的最快算法,并希望它足够快。