在执行不区分大小写的排序以删除web工作程序中的重复项时,首选大写字母唯一
Prefer uppercase unique when doing case-insensitive sort removing duplicates inside web workers
我正在用网页中元素的data-*属性中的关键字填充自动完成下拉列表的数据列表元素,在对它们进行排序和删除重复项时,我更喜欢保留以大写开头的关键字而不是小写关键字。
我获取唯一关键字的代码可能也需要一些优化来提高效率,尽管在网络工作者中运行它意味着这不是优先事项。
我尝试了一个localeCompare技巧来处理caseFirst:上部选项,但这并没有起到作用(或者如果重复删除代码更聪明的话,也许可以)
TL;DR我希望大写的Foo/Bar/Baz位于自动完成下拉列表中,而不是Foo/Bar/Biz
<!DOCTYPE HTML><html lang="en"><head><meta charset="utf-8">
<title>Populate Autocomplete</title>
<script type="text/javascript">
function acEntries(dl,kwlist) {
var blob = new Blob(Array.prototype.map.call(document.querySelectorAll("script[type='"text'/js-worker'"]"), function (oScript) { return oScript.textContent; }),{type: "text/javascript"}),
worker = new Worker(window.URL.createObjectURL(blob));
Array.prototype.slice.call(document.querySelectorAll("dd[data-"+dl.toLowerCase()+"]")).forEach(function(g){
var ds = g.dataset.fooTopics;
if(!ds)return; /* Ensure there is a data- attribute of CSV keywords to include in the kwlist array */
kwlist = kwlist.concat(ds.split(","));
})
worker.postMessage(kwlist); /* Asynchronously remove duplicate keywords and sort */
worker.onmessage = function (ev) {
var d = document.getElementById(dl),t = d.firstChild.content,v = ev.data,
observer = new MutationObserver(function(mo) {
t.firstChild.setAttribute("value",v.shift());
if(v.length<1){observer.disconnect()}
requestAnimationFrame(function(){d.appendChild(t.cloneNode(true))}); /* add the next keyword to datalist */
}),
config = {childList:true};
t.firstChild.setAttribute("value",v.shift());
observer.observe(d,config); /* watch for keywords being added to datalist */
d.appendChild(t.cloneNode(true)); /* add the first keyword to the datalist */
worker.terminate();
}
}
</script></head><body onload="acEntries('Foo-topics',[])">
<dl><dt></dt>
<dd data-foo-topics="Foo,bar,Baz">Foobar Baz</dd>
<dd data-foo-topics="Floo,Bar,Blaz">Floobar Blaz</dd>
<dd data-foo-topics="foo,Blah,baz">Fooblah Baz</dd>
</dl>
<input type="search" list="Foo-topics" placeholder="Foo-topics" autocomplete="off" aria-autocomplete="list">
<datalist id="Foo-topics"><template><option></template></datalist>
<script type="text/js-worker">
self.addEventListener('message', msgRcvd);
function msgRcvd(er) {
var arr = er.data.sort(function(a, b) {
return a.localeCompare(b, {sensitivity:'base',caseFirst:'upper'});
}),
len = arr.length, nw = (len >= 1 ? [arr[0]] : []);
for(var i = 1; i < len; i++) {
if(nw[nw.length -1].toLowerCase() != arr[i].toLowerCase()) {
nw.push(arr[i]);
}
}
self.postMessage(nw);
}
</script></body></html>
在http://htmlpad.org/ArrayComplete/edit
我在看《三个医生》,有人建议"简单地反转极性!"然后我突然想到了…
既然localeCompare排序总是先对数组进行小写排序,而不是从arr[0]开始并向前检查,然后将uniques推到nw[]的末尾,为什么不从末尾或arr[len]开始并向后检查,然后取消将unique斯推到nw]]的开头呢?
function msgRcvd(er) {
var arr = er.data.sort(function(a, b) {
return a.localeCompare(b, {sensitivity:'base'});
}),
len = arr.length, nw = (len >= 1 ? [arr[len - 1]] : []);
while(len--) {
if(nw[0].toLowerCase() != arr[len].toLowerCase()) {
nw.unshift(arr[len]);
}
}
self.postMessage(nw);
}
带有len的while循环,而不是带有i++的for循环
我颠倒了极性,完美的Whovian解决方案:)
相关文章:
- 正好包含2个大写字母和3个数字的正则表达式
- 创建时选择Nav大写字母
- 带有大写字母的棱角分明的光滑属性
- Regex模式,用于检查字符串中每个单词的第一个字母(如果是Javascript中的大写字母)
- 有没有一个函数会忽略javascript中的大写字母
- 如何使用至少一个数字、一个大写字母和6-20个字符验证密码
- 查找大写字母的简单正则表达式是返回小写字母
- 忽略任何非小写字符(如数字、大写字母和符号)并获取k的值
- 正则表达式和 javascript:匹配数字后跟空格和大写字母之间的所有内容
- 将 CSS 类添加到以大写字母开头的行
- 提取大写字母 ( 英语 ) |首选方法
- 如何在提示中接受大写字母?JS
- Javascript正则表达式,需要一个大写字母、一个小写字母和一个数字,并允许特殊
- Javascript:在字符串中,替换大写字母及其后面的所有字母
- 标题中大写字母之间的角度UI网格空间
- 编写一个包含一个大写字母和六个数字的javascript表达式
- JavaScript-删除最后一个大写字母后的所有字符
- 乌克兰字母的正则表达式.如何用大写字母分隔西里尔语单词
- 生成一个随机数字序列,然后用JavaScript在该序列后面附加一个大写字母
- 在执行不区分大小写的排序以删除web工作程序中的重复项时,首选大写字母唯一