春节走亲戚不知道该怎么称呼(”亲戚关系计算器“你值得拥有!)

前言 大家好我是林三心,用最通俗易懂的话讲最难的知识点是我的座右铭,基础是进阶的前提是我的初心,通知大家一个好消息:快过年啦!!!快过年啦!!!
春节走亲戚不知道该怎么称呼(”亲戚关系计算器“你值得拥有!)
文章图片

但是通知大家一个坏消息:过年了,你去走亲戚,你知道应该怎么称呼你的亲戚们吗?比如你爸爸的哥哥的弟弟的儿子,你知道该怎么称呼吗???哈哈哈哈,开个玩笑。但是,确实很多人去走亲戚时,确实不知道怎么称呼自己的亲戚,这时候就体现了编程的魅力了,毕竟著名的程序员「沃夏编德斯基」说过融入生活的编程才是好编程
春节走亲戚不知道该怎么称呼(”亲戚关系计算器“你值得拥有!)
文章图片

普遍做法 做法
现在其实网上很多的做法都是这么做的:称谓 -> 直接关系 -> 称谓,而所用的数据结构类似于下面这种:

{ "爸爸": { "爸爸": "爷爷", "妈妈": "奶奶", "哥哥": "伯父", "弟弟": "叔叔", "姐姐": "姑妈", "妹妹": "姑妈", "丈夫": "未知", "妻子": "妈妈", "儿子": { "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

{{result}}// 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地址
结语 我是林三心,一个热心的前端菜鸟程序员。如果你上进,喜欢前端,想学习前端,那咱们可以交朋友,一起摸鱼哈哈,摸鱼群,加我请备注【思否】
春节走亲戚不知道该怎么称呼(”亲戚关系计算器“你值得拥有!)
文章图片

    推荐阅读