Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检测值是否在Javascript中的一组值中的最快方法_Javascript_Search - Fatal编程技术网

检测值是否在Javascript中的一组值中的最快方法

检测值是否在Javascript中的一组值中的最快方法,javascript,search,Javascript,Search,我在Javascript中有一组字符串,我需要编写一个函数来检测另一个特定字符串是否属于该组 实现这一目标的最快方法是什么?将这组值放入一个数组中,然后编写一个在数组中搜索的函数可以吗 我认为如果我对这些值进行排序并进行二进制搜索,它应该足够快。或者有没有其他聪明的方法可以更快地完成这项工作?使用哈希表可能是一个更快的选择 P>无论你选择什么,它绝对值得测试它对你所考虑的备选方案的性能。 < P>你可以使用一个像这样的对象: // prepare a mock-up object setOfV

我在Javascript中有一组字符串,我需要编写一个函数来检测另一个特定字符串是否属于该组

实现这一目标的最快方法是什么?将这组值放入一个数组中,然后编写一个在数组中搜索的函数可以吗


我认为如果我对这些值进行排序并进行二进制搜索,它应该足够快。或者有没有其他聪明的方法可以更快地完成这项工作?

使用哈希表可能是一个更快的选择


<> P>无论你选择什么,它绝对值得测试它对你所考虑的备选方案的性能。

< P>你可以使用一个像这样的对象:

// prepare a mock-up object
setOfValues = {};
for (var i = 0; i < 100; i++)
  setOfValues["example value " + i] = true;

// check for existence
if (setOfValues["example value 99"]);   // true
if (setOfValues["example value 101"]);  // undefined, essentially: false
//准备一个实体模型对象
setOfValues={};
对于(变量i=0;i<100;i++)
setOfValues[“示例值”+i]=真;
//检查是否存在
if(值集[“示例值99”]);//真的
if(一组值[“示例值101”]);//未定义,本质上是:false
这利用了对象被实现为关联数组这一事实。速度的快慢取决于您的数据和JavaScript引擎实现,但您可以轻松地进行一些性能测试,以与其他版本进行比较


如果一个值在您的集合中可以出现多次,并且“频率”对您很重要,那么您也可以使用递增的数字来代替我在示例中使用的布尔值。

取决于有多少值

如果有几个值(小于10到50),则可以在数组中搜索。一个哈希表可能有点过头了


如果你有很多值,哈希表是最好的选择。与排序值和进行二进制搜索相比,它所需的工作更少。

使用哈希表,并执行以下操作:

// Initialise the set

mySet = {};

// Add to the set

mySet["some string value"] = true;

...

// Test if a value is in the set:

if (testValue in mySet) {
     alert(testValue + " is in the set");
} else {
     alert(testValue + " is not in the set");
}

对上述哈希解决方案的评论。 实际上,{}创建了一个对象(上面也提到过),这可能会导致一些副作用。 其中之一是您的“哈希”已经预先填充了默认的对象方法

因此,值集合中的“toString”将是
true
(至少在Firefox中是这样)。
您可以在字符串前加上另一个字符,例如“.”,以解决此问题,或使用“prototype”库提供的哈希对象。

一种可能的方法,如果该集是不可变的,但仍然可以用于变量集,则效率尤其高:

var haystack = "monday tuesday wednesday thursday friday saturday sunday";
var needle = "Friday";
if (haystack.indexOf(needle.toLowerCase()) >= 0) alert("Found!");
当然,您可能需要更改分隔符,具体取决于必须放在那里的字符串

一个更稳健的变量可以包括边界,以确保“day wed”和“day”都不能正面匹配:

var haystack = "!monday!tuesday!wednesday!thursday!friday!saturday!sunday!";
var needle = "Friday";
if (haystack.indexOf('!' + needle.toLowerCase() + '!') >= 0) alert("Found!");
如果输入是确定的,则可能不需要(例如,超出数据库等)


我在Greasemonkey脚本中使用了这一点,其优点是直接从通用汽车的存储中使用了干草堆。

偶然发现了这一点,并意识到答案已经过时。在这个时代,您不应该使用哈希表实现集合,除非是在特殊情况下。你应该使用

例如:

> let set = new Set();
> set.add('red')

> set.has('red')
true
> set.delete('red')
true
> set.has('red')
false

有关更多示例和讨论,请参阅此SO帖子:

我知道这是一篇旧帖子。但是要检测一个值是否在一组值中,我们可以通过数组
indexOf()
进行操作,该数组搜索并检测值的存在

var myString=“这是我的大字符串集”;
var myStr=myString.split(“”);
log('myStr包含“my”='+(myStr.indexOf('my')>=0));
log('myStr包含“your”='+(myStr.indexOf('your')>=0));
log('整数示例:[1,2,5,3]包含5='+([1,2,5,3].indexOf(5)>=0))您可以使用ES6

var string=“敏捷的棕色狐狸跳过了懒狗。”,
substring=“懒狗”;

log(string.includes(substring))这不起作用。setOfValues[x]如果x不在集合中,则不会计算为未定义,它将产生错误。您想要的是:“setOfValues中的x”来测试成员资格。它的计算结果将是未定义的。它不会导致错误。试试看。我以为JS中的所有东西都是一个哈希表,arry只是0=>firstentry,1=>secondentry,不是吗?@Trull:我怀疑。数组不同于对象,可能是针对性能进行了优化,尽管这取决于实现。使用“in”操作符可能是更优雅的方式+1在尝试围绕AngularJS'ng if跳舞时,我想到了以下语法(在阅读此答案之后):
({value1:1,value2:1})['value2']
-一个自包含的映射测试。感谢您注意到这一点。我讨厌JavaScript的另一个原因。