密钥集合(Set,Map,WeakSet和WeakMap)的ES6规范提供了什么时间复杂度(以大O表示法)?
我的期望,并且我希望大多数开发人员都希望,规范和实现将使用广泛接受的性能算法,在这种情况下Set.prototype.has,add并且delete在一般情况下都是O(1).相同的Map和Weak–等价物.
对于我来说,实现的时间复杂性是否是强制性的,例如在ECMAScript 2015语言规范 - 第6版 - 23.2设置对象中,这一点并不完全清楚.
除非我误解它(我当然很可能),看起来ECMA规范要求实现(例如Set.prototype.has)使用线性时间(O(n))算法.令我非常惊讶的是,规范中不会强制要求甚至不允许使用更高性能的算法,我会对为什么会出现这种情况的解释非常感兴趣.
我不清楚Set和Array在Javascript中的区别是什么(除了Set是ES6中的新功能).为什么要使用Set而不是Array或Object定义.
为什么要介绍Set?
我只是javaScript的初学者,拥有python的背景.我正在尝试这个练习来检查string2的每个字符是否都包含在string1中.例如,如果STRING1是"你好",我会回来true,如果字符串2是"列城"的false,如果字符串2为"低".
我提出的是这个:
function mutation(arr) {
var set = new Set(string1.split(''));
for (var i = 0; i < string2.length; i++)
if (!set.has(string2[i]))
return false;
return true;
}
Run Code Online (Sandbox Code Playgroud)
我还可以去转换字符串2为一组,然后就采取即操作的差异set(string2) - set(string1),这将取我的一组是包含字符串,但不是在字符串1个字符,但我读创建一组是昂贵的,所以我没有去先.
我检查了其他解决方案,每个人都在使用string1.indexOf(letter)方法来检查string2中的每个字母是否都在string1中.
我想知道什么时候应该使用一组差异.为什么每个人都在使用array.indexOf()花费O(n)而不是set.has()O(1)的方法的方法.如果我正在使用,是否有任何陷阱set.has().(说浏览器兼容性)?
任何建议都有帮助.
我遇到了以下基准:https://jsperf.com/array-includes-and-find-methods-vs-set-has \n如果你执行它,你会发现这map.has是迄今为止最在浏览器中查找集合中的项目的有效方法。
我还在 Node 中使用重新创建了这个测试benchmarks.js,并得到了以下结果:
节点9.4.0:
\n\nset.has x 6,454,428 ops/sec \xc2\xb11.25% (90 runs sampled)\nmap.has x 64,519,657 ops/sec \xc2\xb10.95% (86 runs sampled)\narr.includes x 11,415,721 ops/sec \xc2\xb11.41% (87 runs sampled)\narr.indexOf x 11,344,587 ops/sec \xc2\xb11.39% (87 runs sampled)\narr.find x 1,579,635 ops/sec \xc2\xb11.09% (92 runs sampled)\nFastest is map.has\nRun Code Online (Sandbox Code Playgroud)\n\n节点6.2.0:
\n\nset.has x 16,677,473 ops/sec \xc2\xb11.35% (86 runs sampled)\nmap.has x 15,089,503 ops/sec \xc2\xb11.35% (85 runs sampled)\narr.includes x 1,345,019 ops/sec \xc2\xb11.31% (89 runs sampled)\narr.indexOf x 15,943,213 ops/sec …Run Code Online (Sandbox Code Playgroud) 我有一个按字母顺序排列的109582个字符串数组.我的Web应用程序将对数组中是否包含给定字符串进行大量快速检查.显然我可以创建一个包含哈希表或二叉树的包装类,但是我可以使用任何本机JavaScript数据结构吗?
当我有一个对象数组时,如何计算对象属性的唯一值?
let organisations = [
{
"id": 1,
"name": "nameOne",
},
{
"id": 2,
"name": "nameTwo",
},
{
"id": 3,
"name": "nameOne",
}
]
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如何计算唯一组织名称的数量。这里的答案是两个,因为有两个唯一的名称。
这不起作用
var counts = this.filteredExtendedDeals.reduce(
(organisations, name) => {
counts[name] = (counts[name] || 0) + 1;
return counts;
},
{}
);
return Object.keys(counts);
Run Code Online (Sandbox Code Playgroud)