8

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

 2 years ago
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.
neoserver,ios ssh client

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

发布于 1 月 11 日

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

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

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

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

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

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

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

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

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

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

  • 3、数据结构臃肿,出现很多“未知”
    正如上面的数据结构所见。。。“爸爸的丈夫”应该叫啥????”未知“。。。

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

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

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

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

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

截屏2022-01-10 上午7.20.29.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)
    },

亲戚关系计算器-复杂版

亲戚关系计算器

我是林三心,一个热心的前端菜鸟程序员。如果你上进,喜欢前端,想学习前端,那咱们可以交朋友,一起摸鱼哈哈,摸鱼群,加我请备注【思否】

image.png


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK