如何方便的搜索JS复杂数组?

例如下面这个稍微复杂一点的数组 [ { IceCream: ['mint', 'chocolate'], Fruit: 'banana' }, { IceCream: ['candy', 'brownie'], Fruit: 'apple' }, { IceCream: ['cake', 'strawberry'], Fruit: 'orange' } ] 假设有几个需求: 1. 查找 IceCream 中包含 'ca' 的项 2. 查找 Fruit 以 'app' 开头的项 3. 查找 IceCream 中完全匹配 'mint' 的项 如果自己写代码实现的话,会麻烦一些,可以使用 match-sorter 这个插件完成这类的数组搜索工作 match-sorter 可以方便的实现对复杂数组的搜索,并对搜索结果按照匹配度进行排序 基本用法 先用一个简单的数组了解 match-sorter 的用法 const list = ['hi', 'hey', 'hello', 'sup', 'yo'] matchSorter ( list, 'y' ) 使用 matchSorter 对数组 list 进行查找,找包含 'y' 的项 结果: ['yo', 'hey'] 这个结果是经过排序的,原数组中 'hey' 在 'yo' 的前面,但查找 'y' 时,'yo' 的匹配度更高,因为他的第一个字符就是 'y',所以排在了前面 示例 先安装,match-sorter 是通过 npm 发布的,使用 npm 在自己的项目目录下安装 npm install --save match-sorter 然后以开头的数组和需求为例 引入包和定义数组 const matchSorter = require('match-sorter')

const foods = [ {IceCream: ['mint', 'chocolate'], Fruit: 'banana'}, {IceCream: ['candy', 'brownie'], Fruit: 'apple'}, {IceCream: ['cake', 'strawberry'], Fruit: 'orange'} ]; 1)查找 IceCream 中包含 'ca' 的项 var result = matchSorter(foods, 'ca', {keys: ['IceCream']}); console.log(result); 执行结果 [ { IceCream: [ 'candy', 'brownie' ], Fruit: 'apple' }, { IceCream: [ 'cake', 'strawberry' ], Fruit: 'orange' }, { IceCream: [ 'mint', 'chocolate' ], Fruit: 'banana' } ] 参数中的 keys 指定了要查找的项,是个数组,可以指定多项,例如 keys: ['IceCream', 'Fruit']

2)查找 Fruit 以 'app' 开头的项 var result = matchSorter(foods, 'app', {

keys: ['Fruit'], threshold: matchSorter.rankings.STARTS_WITH

}); console.log(result); 执行结果 [ { IceCream: [ 'candy', 'brownie' ], Fruit: 'apple' } ] 这里除了 keys 还增加了 threshold,他用来指定匹配的类型 matchSorter.rankings.STARTS_WITH 是查找以给定值为开头的项

3)查找 IceCream 中完全匹配 'mint' 的项 需求1中不是精确匹配,只要包含 c 和 a 就可以 现在需要完全匹配 'mint' var result = matchSorter(foods, 'mint', {

keys: ['IceCream'], threshold: matchSorter.rankings.EQUALS

}); console.log(result); keys 指定对 IceCream 搜索 thresholdEQUALS 指定使用完全匹配的方式 执行结果 [ { IceCream: [ 'mint', 'chocolate' ], Fruit: 'banana' } ]

4)嵌套 Key 看一个对象嵌套的情况,例如 const nestedObjList = [ {name: {first: 'Janice'}}, {name: {first: 'Fred'}}, {name: {first: 'George'}}, {name: {first: 'Jen'}}, ] 想查找 first 中包含 'j' 的,用法: matchSorter(nestedObjList, 'j', {keys: ['name.first']}) 匹配模式 上面用到了 EQUALSSTARTS_WITH,还有几个其他匹配模式 WORD_STARTS_WITH 如果某项的值是多个单词,只要其中一个词是以给定字符串开头的,就匹配成功 例如 'Sou' 匹配 'South Korea' 或者 'Earth South' 如果使用 STARTS_WITH,则只会匹配 'South Korea' CONTAINS 包含给定值时匹配成功,例如 'ham' 匹配 'Bahamas' ACRONYM 匹配首字母,例如 'us' 匹配 'United States' match-sorter 在大数组匹配上很方便,有此需求时可以仔细了解下 项目地址: https://github.com/kentcdodds/match-sorter

本文分享自微信公众号 - 性能与架构(yogoup)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-09-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏开发与安全

《linux c 编程一站式学习》课后部分习题解答

1、假设变量x和n是两个正整数,我们知道x/n这个表达式的结果要取Floor,例如x是17,n是4,则结果是4。如果希望结果取Ceiling应该怎么写表达式呢?...

49360
来自专栏calvin

【nodejs】让nodejs像后端mvc框架(asp.net mvc)一样处理请求--参数自动映射篇(6/8)

路由、action的扫描、发现、注册搞定之后,后来我发现在我们的action里面获取参数往往都是通过request对象来一个一个获取。同样的一行代码我们不厌其烦...

13220
来自专栏技术小讲堂

ASP.NET AJAX(6)__Microsoft AJAX Library中的面向对象类型系统命名空间类类——构造函数类——定义方法类——定义属性类——注册类类——抽象类类——继承类——调用父类方

如果我们可以合理的使用面向对象编程,我们可以提高代码的复用性和可维护性,这里强调的是合理的使用,有了面向对象类型系统,就可以使用一些成熟的设计方式 命名空间 合...

30650
来自专栏Golang语言社区

【Go 语言社区】Golang内存分配

golang内存分配 new一个对象的时候,入口函数是malloc.go中的newobject函数 func newobject(typ *_type) uns...

39850
来自专栏我是攻城师

Apache Pig学习笔记之内置函数(三)

48940
来自专栏积累沉淀

【译】Java 8的新特性—终极版

声明:本文翻译自Java 8 Features Tutorial – The ULTIMATE Guide,翻译过程中发现并发编程网已经有同学翻译过了:...

269100
来自专栏架构说

题目:将链表的奇数位和偶数位调换组成新的链表

题目:将链表的奇数位和偶数位调换组成新的链表 原题链接: http://oj.leetcode.com/problems/swap-nodes-in-pairs...

69890
来自专栏阿杜的世界

【译】Java 8的新特性—终极版1. 简介2. Java语言的新特性3. Java编译器的新特性4. Java官方库的新特性5. 新的Java工具6. JVM的新特性7. 结论8. 参考资料

前言: Java 8 已经发布很久了,很多报道表明Java 8 是一次重大的版本升级。在Java Code Geeks上已经有很多介绍Java 8新特性的文章,...

13040
来自专栏架构说

Leetcode 200 Number of Islands 岛的个数

1. 遍历每一个结点,如果某结点是陆地且未访问过,岛数目加1,修改未访问标志位,然后把该点放入队列中,以备扩展岛屿使用,进入2 2. 队列不为空时,取出点,然...

34330
来自专栏闻道于事

Java I/O流输入输出,序列化,NIO,NIO.2

31930

扫码关注云+社区

领取腾讯云代金券