首页 > 解决方案 > IndexOf vs _.indexOf(Underscore.js) vs $.inArray ,在使用数组时性能更好?

问题描述

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

标签: javascriptjqueryunderscore.js

解决方案


jQuery 的$.inArray实际上只是 vanilla Array.indexOf 的包装器,当它存在时(它在所有现代浏览器中都是如此。)

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

找出哪个最快的最好方法是针对您的真实数据运行性能测试;不同的算法可能更快或更慢,具体取决于它们使用的数据类型。

(同样值得考虑的是,仅仅为了它包含的一个可能更快的函数而包含整个外部库是否合理;除非您已经依赖该库来获取其他函数,否则最好查看该库代码实际上在做什么并只吸收你需要的部分。)

尽管如此,我很确定你在这里叫错了树:

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

这是 .indexOf 在百万项数组上的快速测试用例;尝试在第一个复选框仍在进行时触发第二个复选框的单击事件:

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 的单线程特性意味着(除了少数例外)第一个事件处理程序将在第二个事件处理程序被占用之前完成。

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


推荐阅读