在github上找个一个比较好的计算亲属关系的算法,核心代码如下:
!function (root, factory) {
if (typeof module === 'object' && module.exports){
module.exports = factory();
}else{
root.relationship = factory();
}
}(typeof window !== 'undefined' ? window : this,function (){
//简写
var _filter = [
/* 表亲 */
{//表亲的关系
exp:/^(.+)&o([^#]+)&l/g,
str:'$1$2'
},
{//表亲的关系
exp:/^(.+)&l([^#]+)&o/g,
str:'$1$2'
},
{//表亲的关系
exp:/(,[ds],(.+),[ds])&[ol]/g,
str:'$1'
},
/* 兄弟姐妹 */
{//哥哥姐姐的哥哥姐姐还是自己的哥哥姐姐(年龄判断)
exp:/(,o[sb])+(,o[sb])/,
str:'$2'
},
{//弟弟妹妹的弟弟妹妹还是自己的弟弟妹妹(年龄判断)
exp:/(,l[sb])+(,l[sb])/,
str:'$2'
},
{//如果自己是男性,兄弟姐妹的兄弟就是自己的兄弟或自己
exp:/^(.*)(,[fh1])(,[olx][sb])+,[olx]b(.*)$/,
str:'$1$2,xb$4#$1$2$4'
},
{//如果自己是女性,兄弟姐妹的姐妹就是自己的姐妹或自己
exp:/^(.*)(,[mw0])(,[olx][sb])+,[olx]s(.*)$/,
str:'$1$2,xs$4#$1$2$4'
},
{//如果自己是男性,兄弟姐妹的姐妹就是自己的姐妹
exp:/(,[fh1])(,[olx][sb])+,[olx]s/g,
str:'$1,xs'
},
{//如果自己是女性,兄弟姐妹的兄弟就是自己的兄弟
exp:/(,[mw0])(,[olx][sb])+,[olx]b/g,
str:'$1,xb'
},
{//不知道性别,兄弟姐妹的兄弟是自己或兄弟
exp:/^,[olx][sb],[olx]b(.+)?$/,
str:'$1#,xb$1'
},
{//不知道性别,兄弟姐妹的姐妹是自己或姐妹
exp:/^,[olx][sb],[olx]s(.+)?$/,
str:'$1#,xs$1'
},
{//将复合称谓拆分
exp:/^,x([sb])$/,
str:',o$1#,l$1'
},
/* 父母 */
{//母亲的丈夫是自己的父亲
exp:/m,h/g,
str:'f'
},
{//父亲的妻子是自己的母亲
exp:/f,w/g,
str:'m'
},
{//兄弟的父母就是自己的父母
exp:/,[xol][sb](,[mf])/g,
str:'$1'
},
/* 父母的子女 */
{//父母的女儿年龄判断是姐姐还是妹妹
exp:/,[mf],d&([ol])/,
str:',$1s'
},
{//父母的儿子年龄判断是哥哥还是弟弟
exp:/,[mf],s&([ol])/,
str:',$1b'
},
{//如果自己是男性,父母的儿子是自己或者兄弟
exp:/^(.*)(,[fh1]|[xol]b),[mf],s(.*)$/,
str:'$1$2,xb$3#$1$2$3'
},
{//如果自己是女性,父母的女儿是自己或者姐妹
exp:/^(.*)(,[mw0]|[xol]s),[mf],d(.*)$/,
str:'$1$2,xs$3#$1$2$3'
},
{//如果自己是女性,父母的儿子是自己兄弟
exp:/(,[mw0]|[xol]s),[mf],s/,
str:'$1,xb'
},
{//如果自己是男性,父母的女儿是自己姐妹
exp:/(,[fh1]|[xol]b),[mf],d/,
str:'$1,xs'
},
{//父母的儿子是自己或兄弟
exp:/^,[mf],s(.+)?$/,
str:',1$1#,xb$1'
},
{//父母的女儿是自己或者姐妹
exp:/^,[mf],d(.+)?$/,
str:',0$1#,xs$1'
},
/* 孩子 */
{//孩子的姐妹是自己的女儿(年龄判断)
exp:/,[ds]&o,ob/g,
str:',s&o'
},
{//孩子的姐妹是自己的女儿(年龄判断)
exp:/,[ds]&o,os/g,
str:',d&o'
},
{//孩子的兄弟是自己的儿子(年龄判断)
exp:/,[ds]&l,lb/g,
str:',s&l'
},
{//孩子的兄弟是自己的儿子(年龄判断)
exp:/,[ds]&l,ls/g,
str:',d&l'
},
{//孩子的姐妹是自己的女儿
exp:/,[ds](&[ol])?,[olx]s/g,
str:',d'
},
{//孩子的兄弟是自己的儿子
exp:/,[ds](&[ol])?,[olx]b/g,
str:',s'
},
/* 夫妻 */
{//自己是女性,女儿或儿子的妈妈是自己
exp:/(,[mwd0](&[ol])?|[olx]s),[ds](&[ol])?,m/g,
str:'$1'
},
{//自己是女性,女儿或儿子的爸爸是自己的丈夫
exp:/(,[mwd0](&[ol])?|[olx]s),[ds](&[ol])?,f/g,
str:'$1,h'
},
{//自己是男性,女儿或儿子的爸爸是自己
exp:/(,[fhs1](&[ol])?|[olx]b),[ds](&[ol])?,f/g,
str:'$1'
},
{//自己是男性,女儿或儿子的妈妈是自己的妻子
exp:/(,[fhs1](&[ol])?|[olx]b),[ds](&[ol])?,m/g,
str:'$1,w'
},
{//不知道性别,子女的妈妈是自己或妻子
exp:/^,[ds],m(.+)?$/,
str:'$1#,w$1'
},
{//不知道性别,子女的爸爸是自己或丈夫
exp:/^,[ds],f(.+)?$/,
str:'$1#,h$1'
},
{//夫妻的孩子就是自己的孩子
exp:/,[wh](,[ds])/g,
str:'$1'
},
{//夫妻的对方是自己
exp:/,w,h|,h,w/g,
str:''
},
{//并列关系处理
exp:/(.+)?\[(.+)\|(.+)\](.+)?/g,
str:'$1$2$4#$1$3$4'
}
];
//关系数据
//语法说明:
//【关系】f:父,m:母,h:夫,w:妻,s:子,d:女,xb:兄弟,ob:兄,lb:弟,xs:姐妹,os:姐,ls:妹
//【修饰符】 1:男性,0:女性,&o:年长,&l:年幼,#:隔断,[a|b]:并列
var _data = {
'':['自己','我'],
//并称
'[f|m]':['父母','爹娘','爹妈','爸妈','双亲','二老','高堂'],
'[h,f|h,m]':['公婆'],
'[xb|xs]':['兄弟姐妹'],
'[s|d]':['子女','儿女','小孩','孩子'],
//本家
'f':['爸爸','父亲','阿爸','老爸','老窦','爹','爹爹','爹地','爹啲','老爹','大大','老爷子','老头子'],
'f,f':['爷爷','祖父','阿爷','奶爷','阿公','老爷'],
'f,f,f':['曾祖父','太爷','太爷爷','太公','祖公','祖奶爷','太老爷'],
'f,f,f,f':['高祖父','老太爷','祖太爷','祖太爷爷','祖太公'],
'f,f,f,f,f':['天祖父'],
'f,f,f,f,f,f':['烈祖父'],
'f,f,f,f,f,m':['烈祖母'],
'f,f,f,f,f,f,f':['太祖父'],
'f,f,f,f,f,f,m':['太祖母'],
'f,f,f,f,f,f,f,f':['远祖父'],
'f,f,f,f,f,f,f,m':['远祖母'],
'f,f,f,f,f,f,f,f,f':['鼻祖父'],
'f,f,f,f,f,f,f,f,m':['鼻祖母'],
'f,f,f,f,m':['天祖母'],
'f,f,f,f,ob':['伯高祖父'],
'f,f,f,f,ob,w':['伯高祖母'],
'f,f,f,f,lb':['叔高祖父'],
'f,f,f,f,lb,w':['叔高祖母'],
'f,f,f,f,xs':['姑高祖母'],
'f,f,f,f,xs,h':['姑高祖父'],
'f,f,f,m':['高祖母','老太太','祖太太','祖太奶','祖太奶奶','祖太婆'],
'f,f,f,m,xs':['姨高祖母'],
'f,f,f,m,xs,h':['姨高祖父'],
'f,f,f,m,xb':['舅高祖父'],
'f,f,f,m,xb,w':['舅高祖母'],
'f,f,f,ob':['曾伯祖父','曾伯父','伯曾祖父','伯公太','伯太爷','伯公老爷'],
'f,f,f,ob,w':['曾伯祖母','曾伯母','伯曾祖母','伯婆太','伯太太','伯婆奶奶'],
'f,f,f,lb':['曾叔祖父','曾叔父','叔曾祖父','叔公太','叔太爷','叔公老爷'],
'f,f,f,lb,w':['曾叔祖母','曾叔母','叔曾祖母','叔婆太','叔太太','叔婆奶奶'],
'f,f,f,xb,s&o':['堂伯祖父','族伯祖父'],
'f,f,f,xb,s&o,w':['堂伯祖母','族伯祖母'],
'f,f,f,xb,s&l':['堂叔祖父','族叔祖父'],
'f,f,f,xb,s&l,w':['堂叔祖母','族叔祖母'],
'f,f,f,xb,s,s&o':['从伯父','族伯父'],
'f,f,f,xb,s,s&o,w':['从伯母','族伯母'],
'f,f,f,xb,s,s&l':['从叔父','族叔父'],
'f,f,f,xb,s,s&l,w':['从叔母','族叔母'],
'f,f,f,xb,s,s,s&o':['族兄'],
'f,f,f,xb,s,s,s&l':['族弟'],
'f,f,f,xb,d':['堂姑祖母'],
'f,f,f,xb,d,h':['堂姑祖父'],
'f,f,f,xs':['曾祖姑母','姑曾祖母','太姑婆','姑婆太','姑太太','曾祖姑','姑婆奶奶'],
'f,f,f,xs,h':['曾祖姑丈','姑曾祖父','太姑丈公','姑丈公太','姑太爷','姑公老爷'],
'f,f,f,xs,s&o':['表伯祖父'],
'f,f,f,xs,s&o,w':['表伯祖母'],
'f,f,f,xs,s&l':['表叔祖父'],
'f,f,f,xs,s&l,w':['表叔祖母'],
'f,f,f,xs,d':['表姑祖母','族祖姑'],
'f,f,f,xs,d,h':['表姑祖父'],
'f,f,m':['曾祖母','太奶奶','太婆','祖婆','祖奶奶'],
'f,f,m,f':['高外祖父','祖太姥爷','祖太公'],
'f,f,m,m':['高外祖母','祖太姥姥','祖太姥娘','祖太婆'],
'f,f,m,xb':['舅曾祖父','太舅公','太舅爷','舅太爷','舅太爷爷','舅公老爷'],
'f,f,m,xb,w':['舅曾祖母','太舅婆','舅太太','舅太奶奶','舅婆奶奶'],
'f,f,m,xb,s&o':['表伯祖父'],
'f,f,m,xb,s&o,w':['表伯祖母'],
'f,f,m,xb,s&l':['表叔祖父'],
'f,f,m,xb,s&l,w':['表叔祖母'],
'f,f,m,xb,d':['表姑祖母'],
'f,f,m,xb,d,h':['表姑祖父'],
'f,f,m,xs':['姨曾祖母','太姨奶','姨太太','曾姨奶奶','姨太奶奶','姨婆奶奶'],
'f,f,m,xs,h':['姨曾祖父','太姨爷','姨太爷','姨太爷爷'],
'f,f,m,xs,s&o':['表伯祖父'],
'f,f,m,xs,s&o,w':['表伯祖母'],
'f,f,m,xs,s&l':['表叔祖父'],
'f,f,m,xs,s&l,w':['表叔祖母'],
'f,f,m,xs,d':['表姑祖母'],
'f,f,m,xs,d,h':['表姑祖父'],
'f,f,xb':['堂祖父','x爷爷'],
'f,f,xb,w':['堂祖母'],
'f,f,xb,s&o':['堂伯','堂伯父','从父伯父'],
'f,f,xb,s&o,w':['堂伯母','从父伯母'],
'f,f,xb,s&l':['堂叔','从父叔父'],
'f,f,xb,s,w':['堂婶','堂叔母','堂婶母','从父叔母'],
'f,f,xb,s,s&o':['从兄','再从兄','从兄弟'],
'f,f,xb,s,s&o,w':['从嫂','再从嫂'],
'f,f,xb,s,s&l':['从弟','再从弟','从兄弟'],
'f,f,xb,s,s&l,w':['从弟妹','再从弟妹','再从兄'],
'f,f,xb,s,s,s':['从侄','再从侄','从侄子'],
'f,f,xb,s,s,s,w':['从侄媳妇','再从侄妇'],
'f,f,xb,s,s,s,s':['从侄孙'],
'f,f,xb,s,s,s,d':['从侄孙女'],
'f,f,xb,s,s,d':['从侄女','再从侄女'],
'f,f,xb,s,s,d,h':['从侄女婿','再从侄女婿','姻家侄婿'],
'f,f,xb,s,d&o':['从姐','再从姐','从姐妹'],
'f,f,xb,s,d&o,h':['从姐夫','再从姐夫'],
'f,f,xb,s,d&l':['从妹','再从妹','从姐妹'],
'f,f,xb,s,d&l,h':['从妹夫','再妹夫'],
'f,f,xb,d':['堂姑','堂姑妈','堂姑母','从父姑母'],
'f,f,xb,d,h':['堂姑丈','堂姑爸','堂姑父','从父姑父'],
'f,f,xb,d,s&o':['堂姑表兄'],
'f,f,xb,d,s&l':['堂姑表弟'],
'f,f,xb,d,d&o':['堂姑表姐'],
'f,f,xb,d,d&l':['堂姑表妹'],
'f,f,ob':['伯祖父','伯老爷','伯公','大爷爷','大爷','堂祖父','伯爷爷'],
'f,f,ob,w':['伯祖母','伯奶奶','伯婆','大奶奶','堂祖母','姆婆'],
'f,f,lb':['叔祖父','叔老爷','叔公','小爷爷','堂祖父','叔爷爷','叔奶