javascript - 在多维数组中查找值的最快方法?

标签 javascript arrays performance

我正在创建一个在多个数组中查找值的函数,但我遇到了一些性能问题,因为数组可能非常长。到目前为止,我发现的最佳性能是这样的:

function isValInArray(arr, value) {
    var bool = false;
    var myArr = arr;
    var myVal = value;
    var i = 0;
    var j = 0;

    for (i = 0; i < myArr.length; i++) {
        for (j = 0; j < myArr[i].length; j++){
            if (myArr[i][j] === myVal ) {
               bool = true;
            }
        }
    }
    return bool;
}

我尝试了一些不同的方法,但前一个函数的性能是迄今为止最好的。

关于如何让它更快一点有什么想法吗?

最佳答案

由于您只关心某个值是否在数组中,因此您可以先将它们展平,然后使用 native 函数仅执行一次搜索。

function isValInArray(arr, value) {
  var myArr = [].concat.apply([], arr);  // from stackoverflow.com/a/10865042/1677912
  return ( myArr.indexOf(value) >= 0 );
}

我修改了@torazaburo提出的jsPerf测试,参见revision 2 。原始测试存在致命偏差,因为它只在一个小数组中搜索单个值,而该值是最后一行中的倒数第二个项目。 (递减循环会找到第二项 - 因此存在偏差。)为了反射(reflect)更真实的场景,现在:

  • 样本数据较大;可配置的 10 x 100 方阵。 (OP 指出数组可能非常长。)
  • 每次测试搜索三个数据点;第一个、最后一个和中间。 (这可以进一步扩展,但此选择涵盖基于循环的解决方案的最佳、最差和平均值。)
  • 值是字符串而不是数字;虽然这会在一定程度上抵消搜索算法的影响,因为字符串比较比数字比较慢,但由于 OP 没有指示值的性质,所以这是一个更现实的假设。

此测试表明所有建议的解决方案都表现相似,这强化了 @torazaburo 的观点,这些类型的微优化是否值得担心是值得怀疑的

我建议您使用最容易维护的解决方案。如果性能对您来说是一个实际问题,请使用真实反射(reflect)您情况的数据来测试您的选择。

如果您想知道,此解决方案在测试中显示为concat

test results

关于javascript - 在多维数组中查找值的最快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34540174/

相关文章:

performance - O(1) 在非连续内存中查找?

javascript - Angular - 无法获取服务以获取成功的 HTTP 请求

c++ - 右移数组

javascript - 在 react 中使用上下文时如何初始化 firebase?

java - Arrays.fill 在 Java 中使用多维数组

c++ - 范围内的最低值

java - 将InputStream复制到OutputStream的更好方法

c++ - 循环、功能设计和效率 : two questions

javascript - 无法使用 Promise 绑定(bind)到 Angular 存储库数据

JavaScript 或 D3js 表示法