当其中一个元素与数组中的项匹配时,我想返回一个数组。
当数组的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。希望这有助于解释我的约束。
答案 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 =您拥有的视频列表总数。
当我走进电脑前,我会发布一些代码。