乐趣区

关于前端:春节走亲戚不知道该怎么称呼亲戚关系计算器你值得拥有

前言

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

然而告诉大家一个 坏消息 :过年了,你去走亲戚,你晓得应该怎么称说你的亲戚们吗?比方你爸爸的哥哥的弟弟的儿子,你晓得该怎么称说吗???哈哈哈哈,开个玩笑。然而,的确很多人去走亲戚时,的确不晓得怎么称说本人的亲戚,这时候就体现了 编程 的魅力了,毕竟驰名的程序员「沃夏编德斯基」说过 融入生存的编程才是好编程

广泛做法

做法

当初其实网上很多的做法都是这么做的:称呼 -> 间接关系 -> 称呼,而所用的数据结构相似于上面这种:

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

结语

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

退出移动版