我正在寻找一个模糊搜索JavaScript库来过滤数组.我已经尝试过使用fuzzyset.js和fuse.js,但结果非常糟糕(你可以尝试在链接页面上进行演示).
在对Levenshtein距离进行一些阅读之后,它让我感到很难接近用户在打字时所寻找的内容.对于那些不知道的人,系统会计算需要多少插入,删除和替换才能使两个字符串匹配.
在Levenshtein-Demerau模型中固定的一个明显的缺陷是blub和boob被认为与灯泡同样相似(每个需要两次替换).然而,很明显,灯泡更像blub而不是bob,而我刚才提到的模型通过允许换位来识别它.
我想在文本完成的上下文中使用它,所以如果我有一个数组['international', 'splint', 'tinder'],并且我的查询是int,我认为国际应该比夹板排名更高,即使前者的得分(更高=更差)为10与后者的3相比.
所以我正在寻找(并且如果它不存在则会创建),是一个执行以下操作的库:
有没有人遇到这样的事情?我意识到StackOverflow不是要求软件推荐的地方,但上面隐含的(不再是!)是:我正在考虑这个正确的方法吗?
我找到了一篇关于这个主题的好文章(pdf).一些注释和摘录:
仿射编辑距离函数为插入或删除序列分配相对较低的成本
Monger-Elkan距离函数(Monge&Elkan 1996),它是Smith-Waterman距离函数的一个仿射变体(Durban et al.1998),具有特定的成本参数
对于Smith-Waterman距离(维基百科),"Smith-Waterman算法不是查看总序列,而是比较所有可能长度的片段,并优化相似性度量." 这是n-gram方法.
Jaro度量标准(Jaro 1995; 1989; Winkler 1999)是一个大致相似的度量标准,它不是基于编辑距离模型.在记录链接文献中,使用该方法的变体获得了良好的结果,该方法基于两个字符串之间的共同字符的数量和顺序.
Winkler(1999)的变体也使用了最长公共前缀的长度P.
(似乎主要用于短字符串)
出于文本完成的目的,Monger-Elkan和Jaro-Winkler方法似乎最有意义.Winkler对Jaro指标的补充有效地加重了单词的开头.而Monger-Elkan的仿射方面意味着完成一个单词的必要性(这只是一系列的补充)不会太过不喜欢它.
结论:
TFIDF排名在几个基于令牌的距离度量中表现最佳,Monge和Elkan提出的调整的仿射间隙编辑距离度量在几个字符串编辑距离度量中表现最佳.一个令人惊讶的好距离度量是一种快速的启发式方案,由Jaro提出,后来由Winkler扩展.这几乎与Monge-Elkan方案一样,但速度提高了一个数量级.组合TFIDF方法和Jaro-Winkler的一种简单方法是使用基于Jaro-Winkler方案的近似令牌匹配替换TFIDF中使用的确切令牌匹配.这种组合平均比Jaro-Winkler或TFIDF略好,并且偶尔表现得更好.对于本文中考虑的几个最佳指标的学习组合,它的性能也很接近.
javascript regex fuzzy-search pattern-matching string-matching
我花了一天的时间才使它成功,所以我认为我的经验可能对某人有用.也许其他一些人会找到改进.
所以我两天前开始使用angularJS.我希望它可以与Google Cloud Endpoints一起使用来创建后端界面.这给我带来了麻烦.
gapi的javascript客户端带有异步加载,因此角度初始化会因为gapi未定义而崩溃.
所以你需要在初始化gapi时引导角度:
<script src="https://apis.google.com/js/client.js?onload=googleOnLoadCallback"></script>添加回调:
function googleOnLoadCallback(){
var apisToLoad = 1; // must match number of calls to gapi.client.load()
var gCallback = function() {
if (--apisToLoad == 0) {
//Manual bootstraping of the application
var $injector = angular.bootstrap(document, ['myApp']);
console.log('Angular bootstrap complete ' + gapi);
};
};
gapi.client.load('helloWorld', 'v1', gCallback, '//' + window.location.host + '/_ah/api');
}
Run Code Online (Sandbox Code Playgroud)感觉很好,但电话怎么样?
所以这是控制器:
angular.module('myApp.controllers', []).
.controller('MyCtrl', ['$scope' ,'helloWorldService',
function($scope,greetingsService) {
helloWorldService.loadData($scope);
}]);
Run Code Online (Sandbox Code Playgroud)
这是服务:
angular.module('myApp.services', [])
service('helloWorldService', [function() { …Run Code Online (Sandbox Code Playgroud) javascript google-app-engine angularjs google-cloud-endpoints gapi
我的index.js文件如下所示:
const actionButton = require('sdk/ui/button/action');
const TAG = "Addon Scratchpad / Index ";
console.log(TAG+'in index.js');
var button = actionButton.ActionButton({
id: "my-button",
label: "my button",
icon: {
"16": "./tool-scratchpad-16.png",
"32": "./tool-scratchpad-32.png"
},
onClick: function() {
debugger;
console.log(TAG+'button clicked');
}
});
Run Code Online (Sandbox Code Playgroud)
文件夹结构是标准:index.js与package.json文件和一个data带有按钮的文件夹png资产.
jpm run导致浏览器打开.但是没有生成按钮,终端或控制台中没有错误,插件调试器声称"此页面没有源代码".
jpm test 导致没有运行测试并且没有抛出错误.
jpm run --debugger 不启动调试器.
在JPM安装期间没有错误(我在全局卸载并重新安装以检查).
index.js位于目录的根目录中,这不是我习惯的,但这显然是正常的:
您的主文件是"index.js",它可以直接在您的加载项的根目录中找到.
如果我解压缩xpi,它看起来很正常.如果我通过拖动到Firefox安装它,同样的问题仍然存在.
我很难过.任何想法,为什么我不能让它工作?
作为一个终端菜鸟,我已经为我所做的一切创建了别名.问题是我开始忘记那些因为它而知道的命令.最重要的是,我有时需要在上一个命令中编辑变量.
所以我想要的是,当我使用别名时,打印的第一行是它所代表的实际命令,然后继续执行命令.由于按下并!!简单地重新打印别名,我不太确定如何获取对底层命令的引用.
谢谢.
设计用于触摸屏设备的默认ngClick的更强大的替代品.在发送点击事件之前,大多数移动浏览器在点击和释放后等待大约300毫秒.此版本立即处理它们,然后阻止以下单击事件传播.
这会在计算机上产生不一致的行为,单击事件继续冒泡/传播,但在移动设备上,它会停止.这意味着在监听元素点击的dom中更高的任何指令都会失败.对我来说似乎是一个错误,但我不能成为第一个必须解决这个问题的人.
element.triggerHandler('click', [event]);
Run Code Online (Sandbox Code Playgroud)
angular.element委托Angular的内置jQuery子集,称为"jQuery lite"或"jqLite".
jqLite可以访问jQuery triggerHandler,但不是trigger.
.triggerHandler()方法的行为与.trigger()类似,但有以下例外:
- 用.triggerHandler()触发的事件不会冒泡DOM层次结构; 如果它们不是直接由目标元素处理的,它们什么都不做.
所以Angular人员需要添加trigger对jqLite的支持并更改该行以trigger使其正常工作.
与此同时,我该如何解决这个问题呢?有没有办法在自定义指令中使用ngClick?
笑的奖励:来自ngTouch源代码的评论
// This is an ugly, terrible hack!
// Yeah, tell me about it.
Run Code Online (Sandbox Code Playgroud) 我使用时似乎无法显示我的插件图标jpm.相关项目package.json是
"icon": "icon.png",
"icon64": "icon64.png",
Run Code Online (Sandbox Code Playgroud)
当我打开扩展程序包时,我将其install.rdf视为
<em:iconURL>icon.png</em:iconURL>
<em:icon64URL>icon64.png</em:icon64URL>
Run Code Online (Sandbox Code Playgroud)
它们分别是48x48和64x64px png文件.
这两个文件都位于扩展的根目录中.如果我正确阅读了文档,我甚至不必指定这些名称,因为它们是默认名称.
我在Addons-manager中看不到任何扩展图标.我究竟做错了什么?
I'm trying to create a React component that is a Line and Scatter chart to look like this:

The React component for a single line with circles looks like this:
function Line ({ color, chartData }) {
return (
<VictoryGroup data={chartData}>
<VictoryLine
style={{ data: { stroke: color } }}
/>
<VictoryScatter
style={{
data: {
stroke: color,
fill: 'white',
strokeWidth: 3
}
}}
/>
</VictoryGroup>
);
}
Run Code Online (Sandbox Code Playgroud)
I am trying to consume the component like so:
function MyCoolChart () {
return …Run Code Online (Sandbox Code Playgroud) 在Firefox中,三角形是否具有锯齿状/锯齿状的边缘(无论是否旋转)。
CSS(html只是<div></div>)
div {
border-top: 10px solid rgba(255, 255, 255, 0);
border-right: 70px solid #777;
border-bottom: 10px solid rgba(255, 255, 255, 0);
transform: rotate(90deg);
}
Run Code Online (Sandbox Code Playgroud)
对于填充其框的形状,可以应用outline: 1px solid transparent。
对于未旋转的形状,您可以简单地应用transform: scale(.999)(位于SO上)。
但是,如果我将CSS的最后一行更改为transform: rotate(90deg) scale(.999),仍然会出现别名。
早在12年就提交并仍标记为“新”的错误,在某种程度上是相关的,并且尚未尝试解决。
是否有其他解决方法可在Firefox中获得平滑的旋转三角形?摆脱中间的发际线将是一个加号。
来自MDN:
toggle方法有一个可选的第二个参数,它将强制根据第二个参数的真实性添加或删除类名.例如,要删除一个类(如果它存在与否),您可以调用
element.classList.toggle('classToBeRemoved', false);并添加一个类(如果存在或不存在),您可以调用element.classList.toggle('classToBeAdded', true);
据我所知,这classList是一个令牌列表,与数组不同,列表不能包含重复项.因此,将一个项目添加到已经拥有它的列表中不会执行任何操作,并且从不包含它的列表中删除项目(显然)不会执行任何操作,这意味着它与之classList.toggle(className, true)相同classList.add(className)且classList.toggle(className, false)完全相同classList.remove(className).
我错过了什么吗?
PS无需警告IE兼容性问题.
我想使用端点API将对象或列表数组发送到app引擎
@ApiMethod(name = "insertGroupMembers")
public List<GroupMembers> insertGroupMembers(Collection<GroupMembers> members) {
EntityManager mgr = getEntityManager();
List<GroupMembers> listMembers = new ArrayList<>();
try {
for (GroupMembers groupMember : members) {
mgr.persist(groupMember);
listMembers.add(groupMember);
}
} finally {
mgr.close();
return listMembers;
}
Run Code Online (Sandbox Code Playgroud)
但是它显示了生成api库时的错误如下: -
说明资源路径位置类型生成Cloud Endpoints类的API元数据时出现问题:com.google.api.server.spi.config.validation.CollectionResourceException:groupmembersendpoint.com.appbell.tagalone.GroupMembersEndpoint.insertGroupMembers参数(类型java .util.Collection):非法参数类型(集合类型'java.util.Collection'中的'class com.appbell.tagalone.GroupMembers').不允许使用数组或实体类型集合.TagAlone-AppEngine未知的Google App Engine云端点问题标记
当我尝试使用私有方法进行面向对象的纯JS时,我经常执行以下操作
(function(exports) {
var Foo = function(num) {
this.num = num
};
var addTwo = function() {
this.num += 2;
};
Foo.prototype.addFour = function() {
addTwo.call(this);
addTwo.call(this);
};
exports.Foo = Foo;
})(this);
Run Code Online (Sandbox Code Playgroud)
然后我就能做到
var foo = new Foo(0);
foo.addFour();
console.log(foo.num); // => 4
Run Code Online (Sandbox Code Playgroud)
它感觉很干净,它允许我创建真正的私有函数,而不是使用_前缀来表示方法应该被视为私有(但实际上不是).
这让我知道我需要哪些功能进行单元测试,哪些不需要.它还可以防止我被诱惑使用应该是私有的功能.但我没有在其他地方看到这种模式.
那么为什么其他人不使用这种模式呢?他们又做了什么呢?
javascript ×5
angularjs ×2
jpm ×2
android ×1
antialiasing ×1
bash ×1
css ×1
css-shapes ×1
dom ×1
endpoint ×1
fuzzy-search ×1
gapi ×1
geometry ×1
html ×1
oop ×1
reactjs ×1
regex ×1
terminal ×1