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

·  阅读 8056
春节走亲戚不知道该怎么称呼?”亲戚关系计算器“你值得拥有!

PK创意闹新春,我正在参加「春节创意投稿大赛」,详情请看:春节创意投稿大赛

前言

大家好我是林三心,用最通俗易懂的话讲最难的知识点是我的座右铭,基础是进阶的前提是我的初心,通知大家一个好消息:快过年啦!!!快过年啦!!!

image.png

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

image.png

普遍做法

做法

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

{
  "爸爸": {
    "爸爸": "爷爷",
    "妈妈": "奶奶",
    "哥哥": "伯父",
    "弟弟": "叔叔",
    "姐姐": "姑妈",
    "妹妹": "姑妈",
    "丈夫": "未知",
    "妻子": "妈妈",
    "儿子": { "older": "哥哥", "middle": "我", "younger": "弟弟" },
    "女儿": { "older": "姐姐", "middle": "我", "younger": "妹妹" }
  }
}
复制代码

截屏2022-01-09 下午7.36.17.png

缺点

其实上面的这种做法,是有很多缺点的:

  • 1、无法直接查询比如“舅妈的婆婆”这样的复合关系

截屏2022-01-09 下午7.47.32.png

  • 2、称谓无法逆向查询,比如:“表哥的妈妈”是“舅妈”、“姨妈”、还是“姑妈”?

截屏2022-01-09 下午7.51.09.png

  • 3、数据结构臃肿,出现很多“未知”

正如上面的数据结构所见。。。“爸爸的丈夫”应该叫啥????”未知“。。。

截屏2022-01-09 下午7.53.23.png

  • 4、无法兼容多种称呼,如“爸爸”也可以称为“父亲”、“爹地”

截屏2022-01-09 下午7.54.43.png

  • 5、无法进行关系链的推理,比如:“舅妈”和我之间的关系链是什么?

截屏2022-01-09 下午7.57.34.png

高级做法

语法

首先制定一套标准,推理亲戚关系时都要以这套标准

关系

字母关系
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,wh,m,合并一起是m,xb,w,h,m
  • 3、合并后的关系链出现冗余,w,h老婆的老公,也就是自己,可简化成m,xb,m,且xb,m兄弟的妈妈,也就是自己的妈妈,于是最后简化成m,m
  • 4、简化后的关系链是一个直接关系链,可以通过键值对去匹配查询即可

截屏2022-01-10 上午6.45.08.png

实现

  • 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便可以简单实现亲戚关系计算器-简易版

简易版亲戚.gif

    // 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)
    },
复制代码

亲戚关系计算器-复杂版

亲戚关系计算器

参考文章

分类:
前端
分类:
前端