循环数组的最快方法

时间:2011-07-13 23:24:28

标签: javascript arrays

当其中一个元素与数组中的项匹配时,我想返回一个数组。

当数组的javascript数组中的值匹配时,下面的代码是循环数组的最快方法吗?

注意:欢迎任何修改变量relatedVideosArray的建议,使其成为不同的数据结构,以获得更好的性能。

var relatedVideosArray = [

["1047694110001"],
["1047694111001", "1019385098001","1020367665001","1020367662001", "1019385097001", "1020367667001"],
["1040885813001"],
["1019385094001", "1019385096001"], 
["952541791001", "952544511001", "952544512001", "952544508001", "952541790001","952580933001", "952580934001", "1051906367001"]                                        

]


function getRelatedVideos(videoClicked){

    var tempStoreArray = [];    
    var getCurrentId = videoClicked;    
    var relVideoslen = relatedVideosArray.length;

    for(var i in relatedVideosArray) {
        tempStoreArray = relatedVideosArray[i]; 
      for(var j in tempStoreArray){             
                if(tempStoreArray[j] == getCurrentId){                  
        return relatedVideosArray[i];                   
        }               
      }
    }       
}

更新:我最初想过将视频ID和值的键作为所有相关的ID,但是如果点击值数组中的任何ID,我想显示键以及所有相关的ID。希望这有助于解释我的约束。

3 个答案:

答案 0 :(得分:2)

现代浏览器支持Array indexOf

对于那些说数组indexOf较慢的人来说,基本测试速度。

var values = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];

console.time("for");
for(var i=0;i<1000;i++){
  for(var j=0;j<=values.length;j++){
    if(values[j]===20) break;
  }
}    
console.timeEnd("for");

console.time("reverse for");
for(i=0;i<1000;i++){
  for(var j=values.length-1;j>=0;j--){
    if(values[j]===1) break;
  }
}
console.timeEnd("reverse for");


console.time("while");
for(i=0;i<1000;i++){
  var j=0;
  while (j<values.length){
    if(values[j]===20) break;
    j++;
  }
}
console.timeEnd("while");


console.time("reverse while");
for(i=0;i<1000;i++){
  var j=values.length-1;
  while (j>=0){
    if(values[j]===1) break;
    j--;
  }
}
console.timeEnd("reverse while");


console.time("indexOf");
for(var i=0;i<1000;i++){
  var x = values.indexOf(20);
}
console.timeEnd("indexOf");

console.time("toString reg exp");
for(var i=0;i<1000;i++){
  var x = (/(,|^)20(,|$)/).test(values.toString);
}
console.timeEnd("toString reg exp");

两种可能的解决方案:

var relatedVideosArray = [

["1047694110001"],
["1047694111001", "1019385098001","1020367665001","1020367662001", "1019385097001", "1020367667001"],
["1040885813001"],
["1019385094001", "1019385096001"], 
["952541791001", "952544511001", "952544512001", "952544508001", "952541790001","952580933001", "952580934001", "1051906367001"]                                        

]

//var getCurrentId = "1019385098001";
var getCurrentId = "1040885813001";


console.time("indexOf");
var tempStoreArray = [];
for(var i = relatedVideosArray.length-1; i>=0; i--){
     var subArr = relatedVideosArray[i];
     if(subArr.indexOf(getCurrentId)!==-1){
        tempStoreArray.push(subArr);
     }
}
console.timeEnd("indexOf");
console.log(tempStoreArray);




console.time("toString reg exp");
var tempStoreArray = [];
var re = new RegExp("(,|^)" + getCurrentId + "(,|$)");
for(var i = relatedVideosArray.length-1; i>=0; i--){
     var subArr = relatedVideosArray[i];
     if(re.test(subArr.toString())){
        tempStoreArray.push(subArr);
     }
}
console.timeEnd("toString reg exp");
console.log(tempStoreArray);

答案 1 :(得分:1)

我相信如果你保持目前的结构。除非你有办法首先“扁平化”数组,否则只有一个数组包含所有值,而不是嵌套。如果这不受您的控制或不切实际,那么除了迭代每个元素及其元素之外别无选择。

否则,您是否可以将值添加到地图中?当前视频ID是关键,值将是相关视频列表。

答案 2 :(得分:1)

如果您可以控制数据结构,那么我强烈建议您将其更改为更适合您正在执行的搜索类型的内容。首先想到的是一组关联数组。您的每个视频阵列都将使用视频ID键入(将值设置为您想要的任何值)。这将使您的搜索O(n),其中n =您拥有的视频列表总数。

当我走进电脑前,我会发布一些代码。

相关问题