在LARGE排序数组中删除长度小于“n”的元素

时间:2015-09-26 06:05:39

标签: javascript jquery arrays

首先让我解释一下我想要的东西。好吧,我有一个像这样的排序数组

var arr = ["ab", "abcd", "abdf", "abcdd", "abcdd", "abcdfd", "abcdsss", "abcdefgh", "abcdsdsdsds"];

现在我需要删除字符串长度小于5的所有元素。好的,现在我的观点是,是否有任何最简单的方法来查找字符串长度为4的元素的索引。这里有两个元素包含字符串长度但我需要最后一个。如果可以获得该索引我可以申请

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

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

7 个答案:

答案 0 :(得分:2)

虽然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"]

这是一个performance comparison过滤器和循环&amp;拼接(上图)策略。正如您所看到的,上述方法在过滤器之前是跳跃式的。

答案 1 :(得分:2)

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

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数组的大量数据);

答案 2 :(得分:1)

尝试这样的事情

  1. 删除长度小于5的所有元素

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

       var lastId = 0;
       var filteredElements = arr.filter(function(e){ 
                  return e.length === 4;
       };
    
       lastId = filteredElement[filteredElement.length-1]?arr.indexOf(filteredElement.pop());
    

答案 3 :(得分:1)

好的方面是你的数组按长度排序,坏的是你有100,000多个元素的数组。

字符串上的正则表达式比循环数组更快(特别是在100k +元素的情况下)

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

  1. 使用join
  2. 将数组转换为字符串
  3. 使用正则表达式提取长度为n
  4. 的所有字符串
  5. 从匹配的集合中获取最后一个元素
  6. 从原始数组中获取此元素的最后一个索引
  7. splice使用此索引的原始数组
  8. Demo

    &#13;
    &#13;
    var arr = ["ab", "abcd", "abdf", "abcdd", "abcdd", "abcdfd", "abcdsss", "abcdefgh", "abcdsdsdsds"];
    
    var matches = arr.join(",").match(/\b[a-z]{5}\b/ig) || [];
    
    arr.splice(0, arr.lastIndexOf(matches[matches.length - 1]) + 1);
    
    console.log(arr);
    document.write(arr);
    &#13;
    &#13;
    &#13;

    正则表达式解释

    1. \b:Word Boundary
    2. [a-z]:匹配所有字母
    3. {n}:完全匹配上一课n次
    4. i:非常敏感的匹配
    5. g:全球,获取所有比赛
    6. 二进制搜索

      您还可以使用二进制搜索将数组拆分为两个相等的子数组,并在单个子数组中搜索具有指定长度的最后一个元素。然后使用此元素获取它的索引,然后拼接原始数组。

      搜索算法由Binary Search in Javascript

      提供

      &#13;
      &#13;
      var arr = ["ab", "abcd", "abdf", "abcdd", "abcdd", "abcdfd", "abcdsss", "abcdefgh", "abcdsdsdsds"];
      
      var copy = arr.slice();
      
      function binarySearch(arr, len) {
        var mid = Math.floor(arr.length / 2);
        console.log(arr[mid], len);
      
        if (arr[mid].length === len && arr[mid + 1].length === len) {
          console.log('match', arr[mid], len);
          return binarySearch(arr.splice(mid));
        } else if (arr[mid].length === len) {
          return arr[mid];
        } else if (arr[mid].length < len && arr.length > 1) {
          console.log('mid lower', arr[mid], len);
          binarySearch(arr.splice(mid, Number.MAX_VALUE), len);
        } else if (arr[mid].length > len && arr.length > 1) {
          console.log('mid higher', arr[mid], len);
          binarySearch(arr.splice(0, mid), len);
        } else {
          console.log('not here', len);
          return -1;
        }
      }
      
      var result = binarySearch(copy, 5);
      
      arr.splice(0, arr.lastIndexOf(result) + 1);
      
      console.log(arr);
      document.write(arr);
      &#13;
      &#13;
      &#13;

答案 4 :(得分:1)

尝试使用do.. while循环

do {
  arr.splice(0,1)
} while (arr[0].length < 5)

答案 5 :(得分:1)

根据Tushar的评论,如果数组已经排序,那么有一种更有效的lodash方法:

arr = _.takeWhile(arr, function(element){ return element.length < 5; });

---老appaorch ---

您可以使用lodash来做到这一点,干净又简单:

arr = _.filter(arr, function(element){return element.length < 5; };

var arr = ["ab", "abcd", "abdf", "abcdd", "abcdd", "abcdfd", "abcdsss", "abcdefgh", "abcdsdsdsds"];

// arr = _.filter(arr, function(element){return element.length < 5; });
arr = _.takeWhile(arr, function(element){ return element.length < 5; });

alert('filtered array: ' + arr);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.min.js"></script>

答案 6 :(得分:1)

我们也可以使用jquery的.grep函数,如bellow

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);

它通常也用于从数组中过滤