前言
大家好我是林三心,用最通俗易懂的话讲最难的知识点是我的座右铭,根底是进阶的前提是我的初心,告诉大家一个好消息:快过年啦!!!快过年啦!!!
然而告诉大家一个坏消息:过年了,你去走亲戚,你晓得应该怎么称说你的亲戚们吗?比方你爸爸的哥哥的弟弟的儿子,你晓得该怎么称说吗???哈哈哈哈,开个玩笑。然而,的确很多人去走亲戚时,的确不晓得怎么称说本人的亲戚,这时候就体现了编程的魅力了,毕竟驰名的程序员「沃夏编德斯基」说过融入生存的编程才是好编程
广泛做法
做法
当初其实网上很多的做法都是这么做的:称呼 -> 间接关系 -> 称呼,而所用的数据结构相似于上面这种:
{ "爸爸": { "爸爸": "爷爷", "妈妈": "奶奶", "哥哥": "伯父", "弟弟": "叔叔", "姐姐": "姑妈", "妹妹": "姑妈", "丈夫": "未知", "妻子": "妈妈", "儿子": { "older": "哥哥", "middle": "我", "younger": "弟弟" }, "女儿": { "older": "姐姐", "middle": "我", "younger": "妹妹" } }}
毛病
其实下面的这种做法,是有很多毛病的:
- 1、无奈间接查问比方“舅妈的婆婆”这样的复合关系
- 2、称呼无奈逆向查问,比方:“表哥的妈妈”是“舅妈”、“姨妈”、还是“姑妈”?
- 3、数据结构臃肿,呈现很多“未知”
正如下面的数据结构所见。。。“爸爸的丈夫”应该叫啥????”未知“。。。
- 4、无奈兼容多种称说,如“爸爸”也能够称为“父亲”、“爹地”
- 5、无奈进行关系链的推理,比方:“舅妈”和我之间的关系链是什么?
高级做法
语法
首先制订一套规范,推理亲戚关系时都要以这套规范
关系
字母 | 关系 |
---|---|
f | 父 |
m | 母 |
h | 夫 |
w | 妻 |
s | 子 |
d | 女 |
xb | 兄弟 |
ob | 兄 |
lb | 弟 |
xs | 姐妹 |
os | 姐 |
ls | 妹 |
修饰符
修饰符 | 含意 | |
---|---|---|
1 | 男性 | |
0 | 女性 | |
&o | 年长 | |
&l | 年幼 | |
# | 隔断 | |
[a\ | b] | 并列 |
数据结构
数据结构是这样的键值对:间接关系链 -> 称呼汇合
举个例子
- 'h':['老公','丈夫','学生','官人','男人','汉子','夫','夫君','相公','夫婿','爱人','老伴']
因为h
代表了夫
,而夫
的称呼有以上几种 - 'h,f':['公公','翁亲','老公公']
因为h,f
代表了夫的父
,称呼有以上几种 - '[h,f|h,m]':['公婆']
因为[h,f|h,m]
意思是老公的爸爸和老公的妈妈
,那就是公婆
- '[f,xb,s&o|f,xb,s&l]':['堂兄弟']
因为[f,xb,s&o|f,xb,s&l]
意思是爸爸的兄弟的年长儿子和爸爸的兄弟的年幼儿子
,那就是堂兄弟
这样在查问关系的时候,只须要对间接关系链进行计算就好了,而不是对称呼进行字典查找
开搞
思路
举个例子
- 1、当用户输出”舅妈的婆婆“,能够分解成”舅妈“和”婆婆“(前者的婆婆)
- 2、分解成的”舅妈“和”婆婆“,关系链别离是
m,xb,w
和h,m
,合并一起是m,xb,w,h,m
- 3、合并后的关系链呈现冗余,
w,h
是老婆的老公
,也就是本人,可简化成m,xb,m
,且xb,m
是兄弟的妈妈
,也就是本人的妈妈,于是最初简化成m,m
- 4、简化后的关系链是一个
间接关系链
,能够通过键值对
去匹配查问即可
实现
- 1、
键值对
,应用JSON
格局保留,键值对模式查问速度快 - 2、关系链简化应用
正则表达式
,一次简化两层关系,直到不能简化,然而简化过程需思考性别,比方:”儿子的妈妈“,当你是男性时代表了你的妻子,当你是女性的时候代表了你本人。这些都须要应用正则表达式
进行匹配,并且替换掉,这也是为什么须要修饰符
的起因
relationship.js
应用形式
装置
npm install relationship.js
应用
const relationship = require("relationship.js")// 自定义模式// 【关系链】f:父,m:母,h:夫,w:妻,s:子,d:女,xb:兄弟,ob:兄,lb:弟,xs:姐妹,os:姐,ls:妹// 【修饰符】 1:男性,0:女性,&o:年长,&l:年幼,#:隔断,[a|b]:并列relationship.setMode('northern',{ 'm,f': ['姥爷'], 'm,m': ['姥姥'], 'm,xb,s&o': ['表哥'], 'm,xb,s&l': ['表弟'],})var options = { text: '', //输出文本(称呼的汉字表白,称呼间用‘的’字分隔) target: '', //针对对象:空示意本人 sex: 1, //本人的性别:0女性,1男性 type: 'default', //转换类型:'default'计算称呼,'chain'计算关系 reverse: false, //称说形式:true对方称说我,false我称说对方 mode: 'default' //模式抉择,可由用户自定义};// 如:我应该叫外婆的哥哥什么?console.log(relationship({ text: '妈妈的妈妈的哥哥' })) // [ '外舅公' ]// 如:七舅姥爷应该叫我什么?console.log(relationship({ text: '七舅姥爷', reverse: true, sex: 1 })) // [ '甥外孙' ]// 如:舅公和我是什么关系?console.log(relationship({ text: '舅公', sex: 0, type: 'chain' }))// [ '爸爸的妈妈的兄弟', '妈妈的妈妈的兄弟', '老公的妈妈的兄弟' ]// 如:舅妈如何称说外婆?console.log(relationship({ text: '外婆', target: '舅妈', sex: 1 })) // [ '婆婆' ]
亲戚关系计算器-简易版
配合 input、select、button
便能够简略实现 亲戚关系计算器-简易版
了
// template <div class="m-l-10 m-t-20"> <input v-model="options.text" /> <input v-model="options.target" /> <br /> <select v-model="options.sex"> <option :value="1">男</option> <option :value="0">女</option> </select> <select v-model="options.type"> <option value="default">称呼</option> <option value="chain">关系</option> </select> <select v-model="options.reverse"> <option :value="false">正向</option> <option :value="true">反向</option> </select> <br /> <button @click="computedRelationship">计算</button> <span>{{result}}</span> </div> // data options: { text: "", target: "", sex: 1, type: "default", reverse: false, mode: "default", }, result: '' import relationship from './relationship' // methods computedRelationship() { console.log(this.options) this.result = relationship(this.options) },
亲戚关系计算器-简单版
亲戚关系计算器
参考文章
- "亲戚关系计算器"算法实现
- relationship.js 的 github地址
结语
我是林三心,一个热心的前端菜鸟程序员。如果你上进,喜爱前端,想学习前端,那咱们能够交朋友,一起摸鱼哈哈,摸鱼群,加我请备注【思否】