【问题标题】:In a Javascript Array, should a value be checked for before being removed?在 Javascript 数组中,是否应该在删除之前检查一个值?
【发布时间】:2019-06-05 18:40:04
【问题描述】:

这里的概念性问题,当使用 Javascript 按值从集合中删除项目时,实现此目的的性能更高的方法是什么?

假设:

function arrayRemove(arr, value) {   
   return arr.filter(function(ele){       
      return ele != value;
});

var array = ['a', 'b', 'c', 'd'];

只是使用

var result = arrayRemove(array, 'b');

比事先检查它的存在更合适

if (array.includes('b')) 
    var result = arrayRemove(array, 'b');

第一个更干净,操作更少,但后者并不总是触发过滤器。

【问题讨论】:

  • 这两个选项都需要迭代整个数组,因此它并不是真正的“更少操作”;)

标签: javascript arrays performance


【解决方案1】:

我为此创建了一个 JS 性能。看起来在检查值是否存在之前调用arrayRemove 函数会更好。

一个简单的测试:

const arr = Array(10000000).fill(Math.random());
arr[10000] = 'e';

let start = Date.now();
const arr2 = arr.filter(v => v !== 'd');
console.log('filter time', Date.now() - start); // --- filter time 1168ms

start = Date.now();
if (arr.includes('e')) {
  console.log('includes time', Date.now() - start); // --- includes time 1ms
}

所以你可以看到数组是否真的很大,如果会更快

https://jsperf.com/js-array-filter/1

【讨论】:

    【解决方案2】:

    我会说var result = arrayRemove(array, 'b'); 更好,因为:

    if (array.includes('b'))
    

    将遍历数组,如果找到b,那么:

    var result = arrayRemove(array, 'b');
    

    将再次遍历数组以将其删除,因此如果元素存在则进行两次迭代,如果不存在则进行一次迭代。在这两种情况下,直接使用arrayRemove(array, 'b') 只会迭代一次。

    【讨论】:

      【解决方案3】:

      最好使用 splice() 提供的内置方法 此方法用于在数组中添加/删除项目,并将返回从数组中删除的项目。 您可以在此处了解有关 Splice 的更多信息。 Splice

      【讨论】:

      • IMO 最好使用Array.filterArray.splice 将要求您首先获取要删除的索引(很可能需要运行一些迭代来获取索引),然后一旦有了索引,您就可以删除。 Array.filter 将在一次迭代中完成
      【解决方案4】:

      我会选择事先不检查它的存在,因为.filter 会处理数组中不存在的值。但是,如果不执行 .filter 并尝试使用 forwhile 为特定键值操作迭代数组,则最好检查值是否存在。

      function arrayRemove(arr, value) {
        return arr.filter(function(ele) {
          return ele != value;
        });
      }
        var arry = ['a', 'c', 'd'];
      
        console.log(arrayRemove(arry,'b'));

      【讨论】:

        【解决方案5】:

        Array.filter 函数创建一个新数组 - 所以它总是会比 if 消耗更多的资源。

        一个简单的测试:

        const arr = Array(10000000).fill(Math.random());
        arr[10000] = 'e';
        
        let start = Date.now();
        const arr2 = arr.filter(v => v !== 'd');
        console.log('filter time', Date.now() - start); // --- filter time 1168ms
        
        start = Date.now();
        if (arr.includes('e')) {
          console.log('includes time', Date.now() - start); // --- includes time 1ms
        }
        

        所以你可以看到如果 mutch 更快的话,数组是否真的很大

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-07
          • 2016-02-10
          • 2016-12-02
          • 1970-01-01
          • 2018-11-27
          • 1970-01-01
          相关资源
          最近更新 更多