承接上文,这是第6个案例:

附上项目链接: https://github.com/wesbos/JavaScript30

这个主要是要实现在给定的json里匹配出搜索框里的city or state,然后把人口加上千分号,下面是我加了注释的源码:

<script>
const endpoint =
'https://gist.githubusercontent.com/Miserlou/c5cd8364bf9b2420bb29/raw/2bf258763cdddd704f8ffd3ea9a3e81d25e2c6f6/cities.json'; const cities = [];
fetch(endpoint)
.then(blob => blob.json())
// 扩展运算符(…)用于取出参数对象中的所有可遍历属性,拷贝到当前对象之中
.then(data => cities.push(...data)); function findMatches(wordToMatch, cities) {
return cities.filter(place => {
// here we need to figure out if the city or state matches what was searched
const regex = new RegExp(wordToMatch, 'gi');
return place.city.match(regex) || place.state.match(regex)
});
} function numberWithCommas(x) {
// 给数字加千分符
return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
/* /\B(?=(\d{3})+(?!\d))/g 这个正则,我正则不太好,所以一开始不知道是什么意思,网上看了下,现在已经完全理解了
1.元字符\B,其实真正要匹配的是这个,就像语文里面,你是一个和蔼可亲的人,最后要匹配的是人,和蔼可亲是条件,这里其实也是后面一串是条件,我试了下
var a = 123456;
a.toString().replace(/\b/g, 'aa') //"aa123456aa" \b匹配的是单词两边的这些空隙
a.toString().replace(/\B/g, 'aa') //"1aa2aa3aa4aa5aa6" \B和\b是相反的,不属于\b的位置就会被\B匹配到
2.先行断言?=,我们再来看后面这个,他的作用,举个例子吧,x(?=y),跟着先行断言后面这个的前面那个就会被匹配到,如:xyz,这里x会被匹配,y不会被匹配,
匹配的是先行断言前面的.在这个正则里面,先行断言后面跟着(\d{3})+,其实是找寻后面跟了3的倍数个数字的位置,像对于一串字符12345来说,
这个正则表达式匹配1和2,2和3这两位置,因为这两个位置后面都满足跟了3的倍数个数字(234和345),很显然还不满足我们的要求,我们是只要2和3这个位置
3.后行断言?!,我们想要的情况,是三个三个数字,但是后面不会再跟着数字的情况,?!\d这个就是这个意思 总结: (?=(\d{3})+(?!\d))代表的是:后面需要跟3的倍数个数字,且在这(3的倍数个数字)之后不能再有数字了,他可以是小数点.或字符串尾。
如12345.67中只有2和3之间的位置满足我们上述的条件。我们只需要指出这个位置,然后将它替换成逗号。 备注:其实后面那个后行断言也可以直接用\b,只要他后面是字符边界,也可以匹配
*/
} function displayMatches() {
const matchArray = findMatches(this.value, cities);
const html = matchArray.map(place => {
const regex = new RegExp(this.value, 'gi');
// 高亮选中的字符
const cityName = place.city.replace(regex, `<span class="hl">${this.value}</span>`);
const stateName = place.state.replace(regex, `<span class="hl">${this.value}</span>`);
return `<li>
<span class="name">${cityName}, ${stateName}</span>
<span class="population">${numberWithCommas(place.population)}</span>
</li>`;
}).join('');
suggestions.innerHTML = html;
} const searchInput = document.querySelector('.search');
const suggestions = document.querySelector('.suggestions'); searchInput.addEventListener('change', displayMatches);
//这个keyup事件貌似没什么用
searchInput.addEventListener('keyup', displayMatches);
</script>

JavaScipt30(第六个案例)(主要知识点:给数字加千分号的正则)的更多相关文章

  1. “全栈2019”Java第十六章:下划线在数字中的意义

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  2. JavaScipt30(第八个案例)(主要知识点:canvas)

    承接上文,这是第8个案例,要实现的效果是按住鼠标不放,进行拖动时可以在画布上画出不同粗细不同颜色的曲线. 附上项目链接: https://github.com/wesbos/JavaScript30 ...

  3. JavaScipt30(第七个案例)(主要知识点:数组some,every,findIndex方法)

    承接上文,这是第7个案例,这个案例没什么说的,主要有三个注意点: 附上项目链接: https://github.com/wesbos/JavaScript30 // 1. slice(begin, e ...

  4. JavaScipt30(第五个案例)(主要知识点:flex布局)

    承接上文,这是第5个案例:这节没什么讲的,随便记录下吧,主要是用了flex布局与transform translateY,js部分和案例1类似. 附上项目链接: https://github.com/ ...

  5. JavaScipt30(第四个案例)(主要知识点:数组原型链上的一些方法)

    承接上文,下面是第四个案例 附上项目链接: https://github.com/wesbos/JavaScript30 const inventors = [ { first: 'Albert', ...

  6. JavaScipt30(第三个案例)(主要知识点:css变量)

    承接上文 https://www.cnblogs.com/wangxi01/p/10641210.html,下面是第三个案例: 附上项目链接: https://github.com/wesbos/Ja ...

  7. [vue案例的知识点]todo-list

    文章的原材料来自于vue的官方示例:https://cn.vuejs.org/v2/examples/todomvc.html,我们在学习过程中,试着对其中的一些知识点进行记录: 一.浏览器数据存储, ...

  8. Java进阶(二十六)公司项目开发知识点回顾

    公司项目开发知识点回顾 前言 "拿来主义"在某些时候并不是最佳选择,尤其是当自己遇到问题的时候,毫无头绪. 在一次实验过程中,需要实现数据库的CRUD操作.由于之前项目开发过程中, ...

  9. React评论展示案例(包含知识点:state、props、ref、React声明周期、localStorage本地存储等)

    本案例在上一篇的案例(React组件之间通过Props传值的技巧(小案例,帮助体会理解props.state.受控组件和非受控组件等))的基础上加强功能和用户体验,但是当然还有很多需要改进的地方,后期 ...

随机推荐

  1. 最大heap

    1 什么是最大heap 最大heap是一棵完全二叉树.每棵子树的根比它的两棵子树上的节点都要大. 2 建堆的过程 function max_heaptify(A): for (i = n/2向下取整: ...

  2. go10---struct

    package main import ( "fmt" ) type test struct{} //空的结构体 type person struct { name string ...

  3. 学习MAP 地图好地址

    http://www.cnblogs.com/beniao/archive/2010/01/13/1646446.html Bēniaǒ成长笔记在IT江湖里我不是一名老手,我只是一名普通的程序员,愿意 ...

  4. POJ 1330 LCA裸题~

    POJ 1330 Description A rooted tree is a well-known data structure in computer science and engineerin ...

  5. ZOJ2107 Quoit Design 最近点对

    ZOJ2107 给定10^5个点,求距离最近的点对的距离. O(n^2)的算法是显而易见的. 可以通过分治优化到O(nlogn) 代码很简单 #include<iostream> #inc ...

  6. oracle中WMSYS.WM_CONCAT函数的版本差异

    昨天在测试的时候发现,开发人员写的一段程序放在开发库中是好的,但是放在测试库中就会有问题.开发人员一直找不到问题的原因在哪里.于是就花了点时间协助开发人员来找问题的根本原因. 通过一些技术手段,定位到 ...

  7. sql语句如何查询当天,一周,一月的数据的语句

    sql查询当天,一周,一个月数据的语句 --查询当天:   select * from info where DateDiff(dd,datetime,getdate())=0 --查询24小时内的: ...

  8. selenium3.4.3 + python3.6 + HTMLTestRunner0.8.0

    HTMLTestRunner下载地址:http://tungwaiyip.info/software/HTMLTestRunner.html.该页面下载的HTMLTestRunner默认支持pytho ...

  9. bzoj 1653: [Usaco2006 Feb]Backward Digit Sums【dfs】

    每个ai在最后sum中的值是本身值乘上组合数,按这个dfs一下即可 #include<iostream> #include<cstdio> using namespace st ...

  10. P5043 【模板】树同构([BJOI2015]树的同构)

    传送门 把所有的树给哈希起来就好了 具体的方法是一个节点的哈希值就是它所有儿子的哈希值给哈希起来,然后以每个节点为根算出它作为根节点的哈希值.那么把每棵树的哈希值排个序,与之前的比较就好了 注意把儿子 ...