Javascript 删除大型排序数组中长度小于“n”的元素

Javascript 删除大型排序数组中长度小于“n”的元素,javascript,jquery,arrays,Javascript,Jquery,Arrays,首先让我解释一下我想要什么。我有一个这样的排序数组 var arr = ["ab", "abcd", "abdf", "abcdd", "abcdd", "abcdfd", "abcdsss", "abcdefgh", "abcdsdsdsds"]; 现在我需要删除字符串长度小于5的所有元素。好的,现在我的重点是,有没有最简单的方法来找到字符串长度为4的元素的索引。这里两个元素包含字符串长度4。但我需要最后一个。如果有可能得到那个索引,我可以申请 arr.splice(0, (index+1)

首先让我解释一下我想要什么。我有一个这样的排序数组

var arr = ["ab", "abcd", "abdf", "abcdd", "abcdd", "abcdfd", "abcdsss", "abcdefgh", "abcdsdsdsds"];
现在我需要删除字符串长度小于5的所有元素。好的,现在我的重点是,有没有最简单的方法来找到字符串长度为4的元素的索引。这里两个元素包含字符串长度4。但我需要最后一个。如果有可能得到那个索引,我可以申请

arr.splice(0, (index+1));

还有一件事,我的原始数组包含100万个数据。现在我该怎么解决这个问题呢?

试试这样的方法

  • 移除长度小于5的所有元件

       var arrFiltered = arr.filter(function(element){ return element.length>=5});
    
  • 获取长度为4的最后一个元素的索引

       var lastId = 0;
       var filteredElements = arr.filter(function(e){ 
                  return e.length === 4;
       };
    
       lastId = filteredElement[filteredElement.length-1]?arr.indexOf(filteredElement.pop());
    
  • 虽然
    filter()
    是最简单的方法,但使用简单的for循环查找最后一个长度为4(或任何值)的元素的索引并执行单个
    slice()
    以获得结果会更有效。尤其是当元素数>长度4较大时

    var arr = ["ab", "abcd", "abdf", "abcdd", "abcdd", "abcdfd", "abcdsss", "abcdefgh", "abcdsdsdsds"],
        lastIndex = false;
    
    // find the number of elements to be removed
    for ( var i = 0; i < arr.length; i++ ) {
        if ( arr[i].length >= 5 ) {
            lastIndex = i;
            break; // break out of the loop
        }
    }
    
    // one single splice to get the result
    arr.splice(0, lastIndex); 
    
    // arr is now ["abcdd", "abcdd", "abcdfd", "abcdsss", "abcdefgh", "abcdsdsdsds"]
    
    var arr=[“ab”、“abcd”、“abdf”、“abcdd”、“abcdd”、“abcdfd”、“abcdsss”、“abcdefgh”、“ABCDSDSDS”],
    lastIndex=false;
    //查找要删除的元素数
    对于(变量i=0;i=5){
    lastIndex=i;
    break;//中断循环
    }
    }
    //只需一个拼接即可获得结果
    arr.splice(0,最后一个索引);
    //arr现在是[“abcdd”、“abcdd”、“abcdfd”、“abcdsss”、“abcdefgh”、“ABCDSDSDS”]
    

    这里是一个过滤器和环路拼接(上面)策略的例子。正如您所看到的,上面的方法比过滤器快得多。

    您可以使用数组过滤器删除元素

    var arr = ["ab", "abcd", "abdf", "abcdd", "abcdd", "abcdfd", "abcdsss", "abcdefgh", "abcdsdsdsds"];
    arr = arr.filter(function(item) { 
      return item.length > 4;
    });
    //["abcdd", "abcdd", "abcdfd", "abcdsss", "abcdefgh", "abcdsdsdsds"]
    

    我不知道数组中是如何包含一百万个项目的,但是在将其发送到客户端之前,您可以尝试减少服务器中的数组。(我不知道您的数据确切来自哪里,但对于javascript数组来说,这是很多数据)

    好的是数组按长度排序,坏的是数组包含100000+个元素

    var arr = ["ab", "abcd", "abdf", "abcdd", "abcdd", "abcdfd", "abcdsss", "abcdefgh", "abcdsdsdsds"];
    arr = arr.filter(function(item) { 
      return item.length > 4;
    });
    //["abcdd", "abcdd", "abcdfd", "abcdsss", "abcdefgh", "abcdsdsdsds"]
    
    字符串上的正则表达式比数组上的循环快(特别是在100k+元素的情况下)

    您可以使用regex获取具有指定长度的最后一个元素,然后使用索引在数组上使用
    splice

  • 使用
    join
  • 使用正则表达式提取长度为
    n
  • 从匹配的集合中获取最后一个元素
  • 从原始数组中获取此元素的最后一个索引
  • 拼接
    使用此索引的原始阵列
  • var arr=[“ab”、“abcd”、“abdf”、“abcdd”、“abcdd”、“abcdfd”、“abcdsss”、“abcdefgh”、“ABCDSDSDS”];
    var matches=arr.join(“,”).match(/\b[a-z]{5}\b/ig)| |[];
    arr.splice(0,arr.lastIndexOf(匹配[matches.length-1])+1);
    控制台日志(arr);
    
    文件编写(arr)尝试使用
    do。。而
    循环

    do {
      arr.splice(0,1)
    } while (arr[0].length < 5)
    
    do{
    对边拼接(0,1)
    }while(arr[0]。长度<5)
    
    在Tushar的评论之后,如果对数组进行排序,则有一种更有效的lodash方法:

    arr = _.takeWhile(arr, function(element){ return element.length < 5; });
    
    arr=..takeWhile(arr,函数(元素){return element.length<5;});
    
    ---老阿帕奇---

    您可以使用以下方法轻松、干净、简单地完成此操作:

    arr = _.filter(arr, function(element){return element.length < 5; };
    
    arr=..filter(arr,函数(元素){return element.length<5;};
    
    var arr=[“ab”、“abcd”、“abdf”、“abcdd”、“abcdd”、“abcdfd”、“abcdsss”、“abcdefgh”、“ABCDSDSDS”];
    //arr=\过滤器(arr,函数(元素){return element.length<5;});
    arr=u.takeWhile(arr,函数(元素){return element.length<5;});
    警报('过滤数组:'+arr);

    我们也可以像下面这样使用jquery的.grep函数

    var arr = ["ab", "abcd", "abdf", "abcdd", "abcdd", "abcdfd", "abcdsss", "abcdefgh", "abcdsdsdsds"],
    
                arr=$.grep(arr,function (obj,i){
                    return obj.length > 4
                })
                console.log('value is'+arr);
    

    它通常也用于从数组中筛选。在数组中循环并拼接出您不想要的条目。如果您有一个包含1000000多个对象的javascript数组,您可能会遇到更深层次的问题。您可以只创建一个新的筛选数组吗?还是必须修改原始数组?
    arr2=arr.filter(/./.test,/[\w\w]{5}/)
    Thank@CollinD。但我真的需要它。因为下一个数组包含1个核心数据。所以我需要一种有效的方法来实现这一点。虽然
    filter()
    是最简单的方法,但使用简单的for循环来查找最后一个长度为4(或其他)的元素的索引会更有效然后用它做一个切片。特别是当元素数>长度4较大时。@SudarshanBiswas即使筛选数组,也必须在整个数组中迭代。这是不可避免的。通过构造长度大于4的新元素数组,您可能会节省时间,但这实际上取决于您的数据。性能您添加的nce比较只有较少的元素~10,它应该至少有10k+元素。另一件事是,当您要搜索具有最大长度的元素时,即当元素位于数组末尾时,此解决方案将慢得多,因此您的
    性能测试在这一点上无法证明任何东西time@Tushar-H这是一个测试,有几千个元素,从length:2到length:11,按长度排序。正如您所说,当要删除的元素数量非常大时(即,匹配的元素非常接近或位于数组末尾)-本机筛选器速度更快。但在所有其他情况下,循环和切片速度更快,因为它不涉及在整个数组中循环。当您要搜索具有最大长度的元素时,即当元素位于数组末尾时,此解决方案将慢得多。第一件事
    lodash
    未标记,OP not mention使用loadash的解决方案。第二件事是当您要搜索长度最大的元素时,即当元素位于数组末尾时,此解决方案的速度会慢得多。如果您对效率的看法正确,我将发布一个修改后的解决方案,至于lodash,我不确定我是否理解不被提及的相关性。如果您想拱起具有最大长度的构件,即。