relationship/script/relationship.js
2016-03-30 11:03:48 +08:00

624 lines
17 KiB
JavaScript

(function(window){
//简写
var _filter = [
/* 表亲 */
{//表亲的关系
exp:/^(.+)&o([^#].+)&o/g,
str:'$1$2&o'
},
{//表亲的关系
exp:/^(.+)&l([^#].+)&l/g,
str:'$1$2&l'
},
{//表亲的关系
exp:/^(.+)&o(.+)&l/g,
str:'$1$2'
},
{//表亲的关系
exp:/^(.+)&l(.+)&o/g,
str:'$1$2'
},
/* 父母 */
{//母亲的丈夫是自己的父亲
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'
},
{//如果自己是男性,父母的儿子是自己或者兄弟
con:/(,[fhs]|([olx]b)),[mf],s/,
exp:/^(.+)?,[mf],s(.+)?$/,
str:'$1$2#$1,xb$2'
},
{//如果自己是女性,父母的女儿是自己或者姐妹
con:/(,[mwd]|([olx]s)),[mf],d/,
exp:/^(.+)?,[mf],d(.+)?$/,
str:'$1$2#$1,xs$2'
},
{//如果自己是女性,父母的儿子是自己兄弟
con:/(,[mwd]|([olx]s)),[mf],s/,
exp:/,[mf],s/g,
str:',xb'
},
{//如果自己是男性,父母的女儿是自己姐妹
con:/(,[fhs]|([olx]b)),[mf],d/,
exp:/,[mf],d/g,
str:',xs'
},
{//父母的儿子是自己或兄妹
exp:/^,[mf],s(.+)?$/,
str:'$1#,xb$1'
},
{//父母的女儿是自己或者姐妹
exp:/^,[mf],d(.+)?$/,
str:'$1#,xs$1'
},
/* 兄弟姐妹 */
{//哥哥姐姐的哥哥姐姐还是自己的哥哥姐姐(年龄判断)
exp:/,o[sb](,o[sb])/,
str:'$1'
},
{//弟弟妹妹的弟弟妹妹还是自己的弟弟妹妹(年龄判断)
exp:/,l[sb](,l[sb])/,
str:'$1'
},
{//如果自己是男性,兄弟姐妹的兄弟就是自己的兄弟或自己
con:/(,[fhs]|([olx]b)),[olx][sb],[olx]b/,
exp:/^(.+)?,[olx][sb],[olx]b(.+)?$/,
str:'$1,xb$2#$1$2'
},
{//如果自己是女性,兄弟姐妹的姐妹就是自己的姐妹或自己
con:/(,[mwd]|([olx]s)),[olx][sb],[olx]s/,
exp:/^(.+)?,[olx][sb],[olx]s(.+)?$/,
str:'$1,xs$2#$1$2'
},
{//如果自己是女性,兄弟姐妹的兄弟就是自己的兄弟
con:/(,[mwd]|([olx]s)),[olx][sb],[olx]b/,
exp:/,[olx][sb],[olx]b/g,
str:',xb'
},
{//如果自己是男性,兄弟姐妹的姐妹就是自己的姐妹
con:/(,[fhs]|([olx]b)),[olx][sb],[olx]s/,
exp:/,[olx][sb],[olx]s/g,
str:',xs'
},
{//不知道性别,兄弟姐妹的兄弟是自己或兄弟
exp:/^,[olx][sb],[olx]b(.+)?$/,
str:',$1#,xb$1'
},
{//不知道性别,兄弟姐妹的姐妹是自己或姐妹
exp:/^,[olx][sb],[olx]s(.+)?$/,
str:',$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:/(,[mwd](&[ol])?|([olx]s)),[ds](&[ol])?,m/g,
str:'$1'
},
{//自己是女性,女儿或儿子的爸爸是自己的丈夫
exp:/(,[mwd](&[ol])?|([olx]s)),[ds](&[ol])?,f/g,
str:'$1,h'
},
{//自己是男性,女儿或儿子的爸爸是自己
exp:/(,[fhs](&[ol])?|([olx]b)),[ds](&[ol])?,f/g,
str:'$1'
},
{//自己是男性,女儿或儿子的妈妈是自己的妻子
exp:/(,[fhs](&[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:''
}
];
var _data = {
'':['自己','我'],
//外家
'm,m':['外婆','姥姥'],
'm,f':['外公','姥爷'],
'm,m,m':['太姥姥'],
'm,m,f':['太姥爷'],
'm,m,xs':['姨姥姥','姨婆'],
'm,m,xs,w':['姨姥爷'],
'm,m,xb':['舅姥爷','舅外祖父','舅外公','舅公'],
'm,m,xb,w':['舅姥姥'],
'm,f,m':['太姥姥'],
'm,f,f':['太姥爷'],
'm,f,xs':['姑姥姥','外太姑母'],
'm,f,xs,h':['姑姥爷','外太姑父'],
'm,f,ob':['大姥爷'],
'm,f,lb':['小姥爷'],
'm,f,xb':['xx姥爷','二姥爷','三姥爷'],
'm,f,xs,s':['表舅'],
'm,f,xs,s,w':['表舅妈'],
'm,m,xs,s':['表舅'],
'm,m,xs,s,w':['表舅妈'],
'm,m,xb,s':['表舅'],
'm,m,xb,s,w':['表舅妈'],
'm,f,xb,s':['堂舅'],
'm,f,xb,s,w':['堂舅妈'],
'm,m,xs,d':['表姨'],
'm,m,xs,d,h':['表姨丈'],
'm,m,xb,d':['表姨'],
'm,m,xb,d,h':['表姨丈'],
'm,f,xs,d':['表姨'],
'm,f,xs,d,h':['表姨丈'],
'm,f,xb,d':['堂姨'],
'm,f,xb,d,h':['堂姨丈'],
//舅家
'm,xb':['舅舅','舅父','舅','娘舅','二舅','三舅'],
'm,xb,w':['舅妈','舅母','妗妗','二舅妈','三舅妈'],
'm,xb,s&o':['表哥(舅家)','表哥'],
'm,xb,s&o,w':['表嫂(舅家)','表嫂'],
'm,xb,s&l':['表弟(舅家)','表弟'],
'm,xb,s&l,w':['表弟媳(舅家)','表弟媳'],
'm,xb,s,s':['表侄子'],
'm,xb,s,d':['表侄女'],
'm,xb,d&o':['表姐(舅家)','表姐'],
'm,xb,d&o,h':['表姐夫(舅家)','表姐夫','表姐丈'],
'm,xb,d&l':['表妹(舅家)','表妹'],
'm,xb,d&l,h':['表妹夫(舅家)','表妹夫'],
'm,xb,d,s':['表外甥'],
'm,xb,d,d':['表外甥女'],
'm,ob':['大舅'],
'm,ob,w':['大舅妈'],
'm,lb':['小舅'],
'm,lb,w':['小舅妈'],
//姨家
'm,xs':['姨妈','姨母','姨姨','姨娘','姨','二姨','三姨'],
'm,xs,h':['姨丈','姨父','二姨父','三姨父'],
'm,xs,s&o':['表哥(姨家)','表哥'],
'm,xs,s&o,w':['表嫂(姨家)','表嫂'],
'm,xs,s&l':['表弟(姨家)','表弟'],
'm,xs,s&l,w':['表弟媳(姨家)','表弟媳'],
'm,xs,s,s':['表侄子'],
'm,xs,s,d':['表侄女'],
'm,xs,d&o':['表姐(姨家)','表姐'],
'm,xs,d&o,h':['表姐夫(姨家)','表姐夫','表姐丈'],
'm,xs,d&l':['表妹(姨家)','表妹'],
'm,xs,d&l,h':['表妹夫(姨家)','表妹夫'],
'm,xs,d,s':['表外甥'],
'm,xs,d,d':['表外甥女'],
'm,os':['大姨','大姨妈'],
'm,os,h':['大姨父','大姨丈','大姨夫'],
'm,ls':['小姨','小姨妈'],
'm,ls,h':['小姨父','小姨丈','小姨夫'],
//姑家
'f,xs':['姑妈','姑母','姑姑','姑'],
'f,xs,h':['姑丈','姑父'],
'f,xs,s&o':['表哥(姑家)','表哥'],
'f,xs,s&o,w':['表嫂(姑家)','表嫂'],
'f,xs,s&l':['表弟(姑家)','表弟'],
'f,xs,s&l,w':['表弟媳(姑家)','表弟媳'],
'f,xs,s,s':['表侄子'],
'f,xs,s,d':['表侄女'],
'f,xs,d&o':['表姐(姑家)','表姐'],
'f,xs,d&o,h':['表姐夫(姑家)','表姐夫','表姐丈'],
'f,xs,d&l':['表妹(姑家)','表妹'],
'f,xs,d&l,h':['表妹夫(姑家)','表妹夫'],
'f,xs,d,s':['表外甥'],
'f,xs,d,d':['表外甥女'],
'f,os':['姑母'],
'f,ls':['姑姐'],
//本家
'f,xb,s&o':['堂哥'],
'f,xb,s&o,w':['堂嫂'],
'f,xb,s&l':['堂弟'],
'f,xb,s&l,w':['堂弟媳'],
'f,xb,s,s':['堂侄子'],
'f,xb,s,d':['堂侄女'],
'f,xb,d&o':['堂姐'],
'f,xb,d&o,h':['堂姐夫'],
'f,xb,d&l':['堂妹'],
'f,xb,d&l,h':['堂妹夫'],
'f,xb,d,s':['堂外甥'],
'f,xb,d,d':['堂外甥女'],
'f,ob':['伯父','伯伯','大伯','二伯','三伯'],
'f,ob,w':['伯母','大娘'],
'f,lb':['叔叔','叔父','叔','二叔','三叔'],
'f,lb,w':['婶婶','婶母','婶'],
'f,f,xs,s&o,':['表伯'],
'f,f,xs,s&l,':['表叔'],
'f,f,xs,s,w':['表婶'],
'f,m,xs,s&o':['表伯'],
'f,m,xs,s&l':['表叔'],
'f,m,xs,s,w':['表婶'],
'f,m,xb,s&o':['表伯'],
'f,m,xb,s&l':['表叔'],
'f,m,xb,s,w':['表婶'],
'f,f,xb,s&o':['堂伯'],
'f,f,xb,s&l':['堂叔'],
'f,f,xb,s,w':['堂婶'],
'f,f,xs,d':['表姑'],
'f,f,xs,d,h':['表姑丈'],
'f,m,xs,d':['表姑'],
'f,m,xs,d,h':['表姑丈'],
'f,m,xb,d':['表姑'],
'f,m,xb,d,h':['表姑丈'],
'f,f,xb,d':['堂姑'],
'f,f,xb,d,h':['堂姑丈'],
//岳家
'w,m':['岳母','丈母娘'],
'w,f':['岳父','老丈人','丈人','泰山','妻父'],
'w,f,ob':['伯岳'],
'w,f,ob,w':['伯岳母'],
'w,f,lb':['叔岳'],
'w,f,lb,w':['叔岳母'],
'w,f,f':['太岳父'],
'w,f,m':['太岳母'],
'w,f,f,ob':['太伯岳'],
'w,f,f,ob,w':['太伯岳母'],
'w,f,f,lb,':['太叔岳'],
'w,f,f,lb,w':['太叔岳母'],
'w,ob':['大舅哥','大舅子','内兄'],
'w,ob,w':['嫂子','大妗子','内嫂'],
'w,lb':['小舅子','内弟'],
'w,lb,w':['弟媳妇','小妗子'],
'w,f,xb,s&o':['姻家兄'],
'w,f,xb,s&l':['姻家弟'],
'w,xb,s':['内侄','妻侄'],
'w,xb,d':['内侄女','妻侄女'],
'w,os':['大姨子','大姨姐','妻姐'],
'w,os,h':['大姨夫','襟兄','连襟'],
'w,ls':['小姨子','小姨姐','妻妹','小妹儿'],
'w,ls,h':['小姨夫','襟弟','连襟'],
'w,xs,s':['妻外甥'],
'w,xs,d':['妻外甥女'],
//婆家
'h,m':['婆婆'],
'h,f':['公公'],
'h,f,ob':['伯翁'],
'h,f,ob,w':['伯婆'],
'h,f,lb':['叔翁'],
'h,f,lb,w':['叔婆'],
'h,f,f':['祖翁'],
'h,f,m':['祖婆'],
'h,f,f,f':['太公翁'],
'h,f,f,m':['太奶亲'],
'h,f,xb,s&o':['堂兄'],
'h,f,xb,s&o,w':['堂嫂'],
'h,f,xb,s&l':['堂弟'],
'h,f,xb,s&l,w':['堂小弟'],
'h,ob':['大伯子','夫兄'],
'h,ob,w':['大婶子','大伯娘','大嫂','夫兄嫂','妯娌'],
'h,lb':['小叔子'],
'h,lb,w':['小婶子','妯娌'],
'h,xb,s':['侄子'],
'h,xb,s,w':['侄媳','侄媳妇'],
'h,xb,s,s':['侄孙','侄孙子'],
'h,xb,s,s,w':['侄孙媳'],
'h,xb,s,d':['侄孙女'],
'h,xb,d':['侄女'],
'h,xb,d,h':['侄女婿'],
'h,xb,d,s':['外侄孙'],
'h,xb,d,d':['外侄孙女'],
'h,os':['大姑子','大姑','大娘姑'],
'h,os,h':['大姑夫','姊丈'],
'h,ls':['小姑子','小姑'],
'h,ls,h':['小姑夫'],
'h,xs,s':['姨甥'],
'h,xs,d':['姨甥女'],
'h,m,xb':['舅公'],
'h,m,xb,w':['舅婆'],
'h,m,xs':['姨婆'],
'h,m,xs,h':['姨公'],
//旁支
'ob':['哥哥','哥','兄','大哥','大佬'],
'ob,w':['嫂子','嫂'],
'ob,w,f':['姻伯父'],
'ob,w,m':['姻伯母'],
'lb':['弟弟','弟'],
'lb,w':['弟妹','弟媳','弟媳妇'],
'lb,w,f':['姻叔父'],
'lb,w,m':['姻叔母'],
'xb,s':['侄子'],
'xb,s,w':['侄媳','侄媳妇'],
'xb,s,s':['侄孙','侄孙子'],
'xb,s,s,w':['侄孙媳'],
'xb,s,d':['侄孙女'],
'xb,d':['侄女'],
'xb,d,h':['侄女婿'],
'xb,d,s':['外侄孙子'],
'xb,d,d':['外侄孙女'],
'os':['姐姐','姐'],
'os,h':['姐夫','姊夫','姊婿'],
'ls':['妹妹','妹'],
'ls,h':['妹夫','妹婿'],
'xs,h,f':['亲家爷','亲爹','亲伯'],
'xs,h,m':['亲家娘','亲娘'],
'xs,s':['外甥'],
'xs,s,w':['外甥媳妇'],
'xs,s,s':['甥孙'],
'xs,s,d':['甥孙女'],
'xs,d':['外甥女','甥女'],
'xs,d,h':['外甥女婿'],
'xs,d,s':['甥外孙'],
'xs,d,s,w':['甥外孙媳妇'],
'xs,d,d':['甥外孙女'],
'xs,d,d,h':['甥外孙女婿'],
//内家
'f,f,f,f':['高祖父'],
'f,f,f,m':['高祖母'],
'f,f,f':['曾祖父'],
'f,f,m':['曾祖母'],
'f,m':['奶奶','祖母'],
'f,f':['爷爷','祖父'],
'f,f,f':['太爷爷'],
'f,f,m':['太奶奶'],
'f,f,xb':['xx爷爷','二爷爷','三爷爷','堂祖父'],
'f,f,xb,w':['xx奶奶','堂祖母'],
'f,f,ob':['大爷爷','大爷','堂祖父'],
'f,f,ob,w':['大奶奶','堂祖母'],
'f,f,lb':['小爷爷','堂祖父'],
'f,f,lb,w':['小奶奶','堂祖母'],
'f,f,xs':['姑奶奶'],
'f,f,xs,h':['姑爷爷'],
'f,m,f':['太爷爷'],
'f,m,m':['太奶奶'],
'f,m,xs':['姨奶奶','姨婆'],
'f,m,xs,h':['姨爷爷','姨公','姨爷'],
'f,m,xb':['舅爷爷','舅公','舅爷','舅祖','舅奶爷','舅祖父'],
'f,m,xb,w':['舅奶奶','舅婆'],
//自家
'm':['妈妈','母亲','老妈','老母','娘','娘亲','妈咪'],
'f':['爸爸','父亲','老爸','老窦','爹','爹地','老爷子'],
'w':['老婆','妻子','太太','媳妇','夫人','女人','婆娘','妻','内人','娘子','爱人'],
'h':['老公','丈夫','先生','官人','男人','汉子','夫','夫君','爱人'],
's':['儿子'],
's,w':['儿媳妇','儿媳'],
's,w,xb':['姻侄'],
's,w,xs':['姻侄女'],
's,s':['孙子'],
's,s,w':['孙媳妇','孙媳'],
's,s,s':['曾孙'],
's,s,s,w':['曾孙媳妇'],
's,s,s,s':['玄孙'],
's,s,d':['曾孙女'],
's,d':['孙女'],
's,d,h':['孙女婿'],
's,d,s':['曾外孙'],
's,d,d':['曾外孙女'],
'd':['女儿','千金'],
'd,h':['女婿'],
'd,h,xb':['姻侄'],
'd,h,xs':['姻侄女'],
'd,s':['外孙'],
'd,s,w':['外孙媳'],
'd,s,s':['外曾孙','重外孙'],
'd,s,d':['外曾孙女','重外孙女'],
'd,d':['外孙女'],
'd,d,h':['外孙女婿'],
'd,d,s':['外曾外孙'],
'd,d,d':['外曾外孙女'],
//其他
's,w,m':['亲家母'],
's,w,f':['亲家公','亲家翁'],
's,w,f,ob':['姻兄'],
's,w,f,lb':['姻弟'],
's,w,f,f':['太姻翁'],
's,w,f,f':['太姻姆'],
'd,h,m':['亲家母'],
'd,h,f':['亲家公','亲家翁'],
'd,h,f,ob':['姻兄'],
'd,h,f,lb':['姻弟'],
'd,h,f,f':['太姻翁'],
'd,h,f,f':['太姻姆']
};
//数组去重
var unique = function(arr) {
var result = [], hash = {};
for (var i = 0, elem; (elem = arr[i]) != null; i++) {
if (!hash[elem]) {
result.push(elem);
hash[elem] = true;
}
}
return result;
};
//分词解析
function getSelectors(str){
var lists = str.split('的');
var result = []; //所有可能性
var match = true;
while(lists.length){
var name = lists.shift(); //当前匹配词
var arr = []; //当前匹配词可能性
var has = false;
for(var i in _data){
var value = _data[i];
if(value.indexOf(name)>-1){ //是否存在该关系
if(i||!lists.length){ //对‘我’的优化
arr.push(i);
}
has = true;
}
}
if(!has){
match = false;
}
if(result.length){ //当前匹配词与之前可能性组合
var res = [];
for(var i=0;i<result.length;i++){
for(var j=0;j<arr.length;j++){
res.push(result[i] +','+arr[j]);
}
}
result = res;
}else{
for(var i=0;i<arr.length;i++){
result.push(','+arr[i]);
}
}
}
return match?result:[];
}
//简化选择器
function selector2id(selector){
var result = [];
var hash = {};
var sex1 = sex2 = -1;//自己或对方性别:-1未知,0女性,1男性
if(selector.indexOf(',w')==0){
sex1 = 1;
}else if(selector.indexOf(',h')==0){
sex1 = 0;
}
sex2 = selector.match(/,[mw]|([olx]s)|(d(&[ol]))$/)?0:1;
var getId = function(selector){
var s='';
if(!hash[selector]){
hash[selector] = true;
var status = true;
do{
s = selector;
for(var i in _filter){
var item = _filter[i];
if(item['con']){
if(selector.match(item['con'])){
selector = selector.replace(item['exp'],item['str']);
}
}else{
selector = selector.replace(item['exp'],item['str']);
}
if(selector.indexOf('#')>-1){
var arr = selector.split('#');
for(var i=0;i<arr.length;i++){
getId(arr[i]);
}
status=false;
break;
}
}
// console.log('selector#',selector);
}while(s!=selector);
if(status){
if(selector==''&&sex1>-1&&sex1!=sex2){
}else{
selector = selector.substr(1); //去前面逗号
result.push(selector);
}
}
}
}
getId(selector);
return result;
}
//获取数据
function getDataById(id){
var result = [];
var filter = /&[olx]/g; //忽略属性查找数据
for(var i in _data){
if(i.replace(filter,'')==id){
result.push(_data[i]);
}
}
return result;
}
function relationship(str){
var selectors = getSelectors(str);
// console.log('selectors#',selectors);
var result = []; //匹配结果
for(var i = 0;i<selectors.length;i++){ //遍历所有可能性
var ids = selector2id(selectors[i]);
// console.log('ids#',ids);
for(var j=0;j<ids.length;j++){
var id = ids[j];
if(_data[id]){ //直接匹配称呼
result.push(_data[id][0]);
}else{ //高级查找
var data = getDataById(id); //忽略属性查找
if(!data.length){ //当无精确数据时,忽略年龄条件查找
id = id.replace(/&[ol]/g,'');
data = getDataById(id);
}
if(!data.length){
id = id.replace(/[ol]/g,'x');
data = getDataById(id);
}
if(!data.length){
var l = id.replace(/x/g,'l');
data = getDataById(l);
var o = id.replace(/x/g,'o');
data = data.concat(getDataById(o));
}
for(var d=0;d<data.length;d++){
result.push(data[d][0]);
}
}
}
}
return unique(result);
}
window.relationship = relationship;
})(window);
// console.log(relationship('我的大爷'));
//弟弟的爸爸的女儿
//老婆的爸爸的女儿
//表哥的表哥
//大舅的女儿
//表哥的姐姐
//爸爸的表姐
//表嫂的女儿的爸爸
//老公的老婆的儿子的爸爸的老婆的儿子的爸爸
//我的三舅的儿子的爸爸的妹妹的儿子的叔叔的哥哥
//老婆的外孙的姥姥