春节走亲戚不知道该怎么称呼?”亲戚关系计算器“你值得拥有!
source link: https://segmentfault.com/a/1190000041262222
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
春节走亲戚不知道该怎么称呼?”亲戚关系计算器“你值得拥有!
大家好我是林三心,用最通俗易懂的话讲最难的知识点是我的座右铭,基础是进阶的前提是我的初心,通知大家一个好消息:快过年啦!!!快过年啦!!!
但是通知大家一个坏消息:过年了,你去走亲戚,你知道应该怎么称呼你的亲戚们吗?比如你爸爸的哥哥的弟弟的儿子,你知道该怎么称呼吗???哈哈哈哈,开个玩笑。但是,确实很多人去走亲戚时,确实不知道怎么称呼自己的亲戚,这时候就体现了编程的魅力了,毕竟著名的程序员「沃夏编德斯基」说过融入生活的编程才是好编程
现在其实网上很多的做法都是这么做的:称谓 -> 直接关系 -> 称谓,而所用的数据结构类似于下面这种:
{ "爸爸": { "爸爸": "爷爷", "妈妈": "奶奶", "哥哥": "伯父", "弟弟": "叔叔", "姐姐": "姑妈", "妹妹": "姑妈", "丈夫": "未知", "妻子": "妈妈", "儿子": { "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) },
亲戚关系计算器-复杂版
我是林三心,一个热心的前端菜鸟程序员。如果你上进,喜欢前端,想学习前端,那咱们可以交朋友,一起摸鱼哈哈,摸鱼群,加我请备注【思否】
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK