我正在处理JavaScript上的性能问题.所以我只想问:检查字符串是否包含另一个子字符串的最快方法是什么(我只需要布尔值)?您能否提出您的想法和示例代码段?
我有多个带有字符串值的数组,我想比较它们,只保留所有数组之间相同的匹配结果.
鉴于此示例代码:
var arr1 = ['apple', 'orange', 'banana', 'pear', 'fish', 'pancake', 'taco', 'pizza'];
var arr2 = ['taco', 'fish', 'apple', 'pizza'];
var arr3 = ['banana', 'pizza', 'fish', 'apple'];
Run Code Online (Sandbox Code Playgroud)
我想生成以下包含所有给定数组的匹配的数组:
['apple', 'fish', 'pizza']
Run Code Online (Sandbox Code Playgroud)
我知道我可以将所有数组组合在一起,var newArr = arr1.concat(arr2, arr3);但只需给我一个包含所有数组的数组,再加上重复数组.这可以轻松完成,而不需要像underscore.js这样的库的开销吗?
(太好了,现在我也饿了!)
编辑我想我应该提到可能有一个未知数量的数组,我只是以3为例.
对于我最近写的一些算法,我认为哈希会非常好.我认为我可能只是使用对象中的成员变量作为键值对.我不确定这是否是最佳的,因为我真的不知道幕后发生了什么.我还假设V8与其他环境的不同之处.但我想,查找成员变量会非常快(希望如此)?
总而言之,我想知道在JavaScript对象中编写,读取,创建和删除成员变量的运行时复杂性是否都是O(1).如果环境存在差异(v8与其他相比),它们是什么?
我有两个数组,我希望能够比较两个数组,只返回匹配的值.例如,两个数组都具有值cat,因此将返回该值.我还没有找到这样的东西.返回相似之处的最佳方法是什么?
var array1 = ["cat", "sum","fun", "run"];
var array2 = ["bat", "cat","dog","sun", "hut", "gut"];
//if value in array1 is equal to value in array2 then return match: cat
Run Code Online (Sandbox Code Playgroud) _.intersection([], [])
Run Code Online (Sandbox Code Playgroud)
只适用于原始类型,对吧?
它不适用于对象.如何使它与对象一起工作(可能通过检查"Id"字段)?
var a = [ {'id': 1, 'name': 'jake' }, {'id':4, 'name': 'jenny'} ]
var b = [ {'id': 1, 'name': 'jake' }, {'id': 9, 'name': 'nick'} ]
Run Code Online (Sandbox Code Playgroud)
在此示例中,结果应为:
_.intersection(a, b);
Run Code Online (Sandbox Code Playgroud)
[{'id':1,'name':'jake'}];
给定两个不等长的数组:
var arr1 = ["mike", "sue", "tom", "kathy", "henry"]; //arr1.length = 5
var arr2 = ["howey", "jim", "sue", "jennifer", "kathy", "hank", "alex"]; //arr2.length = 7
Run Code Online (Sandbox Code Playgroud)
如何找到两个数组共有的值?在这种情况下"sue","kathy"应该返回.
我正在寻找类似于Redis KEYS命令所接受的匹配的glob样式模式.引用:
- h?llo匹配hello,hallo和hxllo
- h*llo匹配hllo和heeeello
- h [ae] llo匹配hello和hallo,但不匹配hillo
但是我没有匹配文本字符串,而是将模式与另一个模式匹配,所有运算符都在两端都有意义.
例如,这些模式应该在同一行中相互匹配:
prefix* prefix:extended*
*suffix *:extended:suffix
left*right left*middle*right
a*b*c a*b*d*b*c
hello* *ok
pre[ab]fix* pre[bc]fix*
Run Code Online (Sandbox Code Playgroud)
这些不应该匹配:
prefix* wrong:prefix:*
*suffix *suffix:wrong
left*right right*middle*left
pre[ab]fix* pre[xy]fix*
?*b*? bcb
Run Code Online (Sandbox Code Playgroud)
所以我想知道......
编辑:在RegEx子集上找到这个其他问题,但这与单词hello*和*ok匹配不是彼此的子集/超集的单词不完全相同,但它们相交.
所以我想从数学角度来看,这可能是用来表达的; 是否有可能确定地检查一个模式匹配的一组单词与另一个模式匹配的一组单词相交,导致非空集?
编辑:朋友@neizod绘制了这个消除表,它可以整齐地显示可能是潜在/部分解决方案:消除规则
编辑:将为那些也可以提供工作代码(使用任何语言)和测试用例证明它的人增加额外的奖励.
编辑:添加?*b*?@DanielGimenez在评论中发现的测试用例.
我知道这个问题,最简单的数组交叉代码,但所有的解决方案都假定数组的数量是两个,这在我的情况下是不可能的.
我在页面上有div包含数组的数据.我想找到所有数组共有的值.我不知道我将提前有多少个div /数组.计算所有数组共有的值的最佳方法是什么?
var array1 = ["Lorem", "ipsum", "dolor"];
var array2 = ["Lorem", "ipsum", "quick", "brown", "foo"];
var array3 = ["Jumps", "Over", "Lazy", "Lorem"];
var array4 = [1337, 420, 666, "Lorem"];
//Result should be ["Lorem"];
Run Code Online (Sandbox Code Playgroud)
我在其他地方使用Underscore.js找到了另一种解决方案.
var arrayOfArrays = [[4234, 2323, 43], [1323, 43, 1313], [23, 34, 43]];
_.intersection.apply(_, arrayOfArrays)
//Result is [43]
Run Code Online (Sandbox Code Playgroud)
我在最后用简单的虚拟数据进行了测试,看起来很有效.但由于某种原因,我正在制作的一些包含简单字符串的数组也自动包含一个附加值,"equals:function":
["Dummy1", "Dummy2", "Dummy3", equals: function]
Run Code Online (Sandbox Code Playgroud)
每当我使用Underscore.js交集方法时,在数组数组中,我总是在开发工具中得到[equals:function],而不是 - 如果"Dummy3"对所有数组都是通用的 - ["Dummy3"].
那么TL; DR是否有另一种适合我的情况的阵列交叉解决方案?任何人都可以解释[equals:function]在这里意味着什么?当我在开发工具中展开项目时,它会生成一个空数组和数组上可用的方法列表(pop,push,shift等),但这些方法都已淡出,而equals:function则突出显示.
我有两个数组,我需要互相检查,如果他们已达到每个数组中的两个项实际上彼此相同的点,然后在某处附加一些html.
以下是我一直在尝试的一些代码:
var daysArray = ["1", "2", "3", "4", "5"];
var courseHwork = ["4", "8", "15", "16", "23", "42"];
Run Code Online (Sandbox Code Playgroud)
所以在上面的数组中只有一个匹配值,即:"4"
这是下一部分:
for (var i = 0; i < courseHwork.length; i++) {
//in my actual code courseHwork contains several objects, each of which
//has a duedate property, so here I want to see if this part of the duedate
//property is equal to any position in the daysArray array.
if (courseHwork[i].duedate.substring(8,10) === daysArray[i]) {
//here I mean to select an element …Run Code Online (Sandbox Code Playgroud) 当用作哈希时,JavaScript的数组访问的大O是什么?
例如,
var x= [];
for(var i=0; i<100000; i++){
x[i.toString()+'a'] = 123; // using string to illustrate x[alpha]
}
alert(x['9999a']); // linear search?
Run Code Online (Sandbox Code Playgroud)
人们可以希望JS引擎不会在内部使用线性搜索O(n),但这是肯定的吗?
javascript ×9
arrays ×5
jquery ×2
regex ×2
algorithm ×1
big-o ×1
for-loop ×1
hash ×1
hashtable ×1
if-statement ×1
performance ×1
substring ×1