updated bue修复及功能添加

修复两者称谓性别判断s和xs逻辑问题,及关系链输出性别参数带出等问题;
添加合称功能
This commit is contained in:
PASSER-BY 2022-08-23 02:26:05 +08:00
parent 0a707df25b
commit 72d0eef45d
8 changed files with 232 additions and 131 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -35,7 +35,7 @@ var options = {
text:'', //目标对象:目标对象的称谓汉字表达,称谓间用‘的’字分隔 text:'', //目标对象:目标对象的称谓汉字表达,称谓间用‘的’字分隔
target:'', //相对对象:相对对象的称谓汉字表达,称谓间用‘的’字分隔,空表示自己 target:'', //相对对象:相对对象的称谓汉字表达,称谓间用‘的’字分隔,空表示自己
sex:-1, //本人性别0表示女性,1表示男性 sex:-1, //本人性别0表示女性,1表示男性
type:'default', //转换类型:'default'计算称谓,'chain'计算关系 type:'default', //转换类型:'default'计算称谓,'chain'计算关系链,'pair'计算关系合称
reverse:false, //称呼方式true对方称呼我,false我称呼对方 reverse:false, //称呼方式true对方称呼我,false我称呼对方
mode:'default' //模式选择使用setMode方法定制不同地区模式在此选择自定义模式 mode:'default' //模式选择使用setMode方法定制不同地区模式在此选择自定义模式
}; };
@ -46,15 +46,24 @@ var options = {
```js ```js
// 如:我应该叫外婆的哥哥什么? // 如:我应该叫外婆的哥哥什么?
relationship({text:'妈妈的妈妈的哥哥'}); relationship({text:'妈妈的妈妈的哥哥'});
// => ['舅外公']
// 如:七舅姥爷应该叫我什么? // 如:七舅姥爷应该叫我什么?
relationship({text:'七舅姥爷','reverse':true,'sex':1}); relationship({text:'七舅姥爷',reverse:true,sex:1});
// => ['甥外孙']
// 如:舅公和我是什么关系? // 如:舅公和我具体是什么关系?
relationship({text:'舅公',sex:0,type:'chain'}); relationship({text:'舅公',type:'chain'});
// => ['爸爸的妈妈的兄弟', '妈妈的妈妈的兄弟', '老公的妈妈的兄弟']
// 如:舅妈如何称呼外婆? // 如:舅妈如何称呼外婆?
relationship({text:'外婆',target:'舅妈',sex:1}); relationship({text:'外婆',target:'舅妈',sex:1});
// => ['婆婆']
// 如:外婆和奶奶之间是什么关系?
relationship({text:'外婆',target:'奶奶',type:'pair'});
// => ['儿女亲家']
``` ```
2. 内部属性:获取当前数据表 `relationship.data`. 2. 内部属性:获取当前数据表 `relationship.data`.

View File

@ -227,7 +227,7 @@ export default {
'm,m,xs':['姨外婆','姨婆'], 'm,m,xs':['姨外婆','姨婆'],
'm,m,xs,h':['姨外公','姨公','外姨丈公','外丈公'], 'm,m,xs,h':['姨外公','姨公','外姨丈公','外丈公'],
// 父系 // 父系
'f':['爸爸','父亲','老爸','阿爸','阿父','阿爹','老窦','爹地','依爹','老爹','老汉','老爷子','老子','牙老子','爸','父','爹','老汉儿','牙老倌','爸比','爹爹','爹啲','一世祖'], 'f':['爸爸','父亲','老父亲','老爸','阿爸','阿父','阿爹','老窦','爹地','依爹','老爹','老汉','老爷子','老子','牙老子','爸','父','爹','老汉儿','牙老倌','爸比','爹爹','爹啲','一世祖'],
'f,ob':['伯父','伯伯','伯爸','伯爷','依伯','世父','大爷','大爸','大爸爸','大爹','伯儿','大伯','大大','阿伯','伯'], 'f,ob':['伯父','伯伯','伯爸','伯爷','依伯','世父','大爷','大爸','大爸爸','大爹','伯儿','大伯','大大','阿伯','伯'],
'f,ob,w':['伯母','伯妈','伯娘','依姆','世母','大娘','大妈','大妈妈','大嬷','伯妇','大嬷','大姆妈','伯姐','姆'], 'f,ob,w':['伯母','伯妈','伯娘','依姆','世母','大娘','大妈','大妈妈','大嬷','伯妇','大嬷','大姆妈','伯姐','姆'],
'f,lb':['叔叔','叔父','叔爸','叔爹','阿叔','叔儿','仲父','季父','叔仔','依叔','小叔','小爹','小爸','尕爸','幺爸','幺爹','幺叔','细叔','满叔','晚叔','叔'], 'f,lb':['叔叔','叔父','叔爸','叔爹','阿叔','叔儿','仲父','季父','叔仔','依叔','小叔','小爹','小爸','尕爸','幺爸','幺爹','幺叔','细叔','满叔','晚叔','叔'],
@ -304,7 +304,7 @@ export default {
'f,f,f,f,xb,s,s,[s&o|s&l]':['族伯叔父','三从父','族父'], 'f,f,f,f,xb,s,s,[s&o|s&l]':['族伯叔父','三从父','族父'],
'f,f,f,f,xb,s,s,[s&o|s&l],w':['族伯叔母','三从母','族母'], 'f,f,f,f,xb,s,s,[s&o|s&l],w':['族伯叔母','三从母','族母'],
// 母系 // 母系
'm':['妈妈','母亲','老妈','阿妈','阿母','阿娘','老母','妈咪','依妈','老娘','老乸','老妈子','妈子','娘老子','妈','母','娘','阿毑','姆嬷','姆妈','娘亲'], 'm':['妈妈','母亲','老母亲','老妈','阿妈','阿母','阿娘','老母','妈咪','依妈','老娘','老乸','老妈子','妈子','娘老子','妈','母','娘','阿毑','姆嬷','姆妈','娘亲'],
'm,ob':['大舅','大舅舅','舅伯','元舅'], 'm,ob':['大舅','大舅舅','舅伯','元舅'],
'm,ob,w':['大舅妈','大妗','舅嫲'], 'm,ob,w':['大舅妈','大妗','舅嫲'],
'm,lb':['小舅','小舅舅','舅仔','舅父仔','幺舅','老舅','细舅','满舅','尕阿舅'], 'm,lb':['小舅','小舅舅','舅仔','舅父仔','幺舅','老舅','细舅','满舅','尕阿舅'],

View File

@ -1,6 +1,7 @@
// 通用方法 // 通用方法
import _filter from './filter'; import _filter from './filter';
import _map from './map'; import _map from './map';
import _pair from './pair';
var _mode = {}; // 模式数据 var _mode = {}; // 模式数据
var _data = Object.assign({},_map); // 最终数据 var _data = Object.assign({},_map); // 最终数据
@ -137,6 +138,71 @@ export function getSelectors(str){
return isMatch?result:[]; return isMatch?result:[];
}; };
// 合并选择器,查找两个对象之间的关系
export function mergeSelector(from,to,my_sex){
if(my_sex<0){
var to_sex = -1;
var from_sex = -1;
if(from.match(/^,[w1]/)){
from_sex = 1;
}else if(from.match(/^,[h0]/)){
from_sex = 0;
}
if(to.match(/^,[w1]/)){
to_sex = 1;
}else if(to.match(/^,[h0]/)){
to_sex = 0;
}
if(from_sex==-1&&to_sex>-1){
my_sex = to_sex;
}else if(from_sex>-1&&to_sex==-1){
my_sex = from_sex;
}else if(from_sex==to_sex){
my_sex = from_sex;
}else{
return false;
}
}
var sex = my_sex;
var from_ids = selector2id(from,my_sex);
var to_ids = selector2id(to,my_sex);
var to_rids = [];
if(!from_ids.length||!to_ids.length){
return false;
}
if(to){
var toIsMale = false;
var toIsFemale = false;
to_ids.forEach(function(id){
var selector = ','+id;
if(selector.match(/,([fhs1](&[ol])?|[olx]b)$/)){
toIsMale = true;
}
if(selector.match(/,([mwd0](&[ol])?|[olx]s)$/)){
toIsFemale = true;
}
to_rids = to_rids.concat(reverseId(id,my_sex));
});
to_rids = unique(to_rids);
if(toIsMale&&toIsFemale){
sex = -1;
}else if(toIsMale){
sex = 1;
}else if(toIsFemale){
sex = 0;
}
}else{
to_rids = [''];
}
// console.log('[from_ids]',from_ids,'to_rids',to_rids);
var from_selector = from_ids.length>1?'['+from_ids.join('|')+']':from_ids[0];
var to_selector = to_rids.length>1?'['+to_rids.join('|')+']':to_rids[0];
return {
'selector':(to?','+to_selector:'')+(from?','+from_selector:''),
'sex':sex
};
};
// 选择器转ID // 选择器转ID
export function selector2id(selector,sex){ export function selector2id(selector,sex){
var result = []; var result = [];
@ -158,6 +224,9 @@ export function selector2id(selector,sex){
} }
// console.log('[selector]',selector); // console.log('[selector]',selector);
var getId = function(selector,sex){ var getId = function(selector,sex){
if(!selector.match(/^,/)){
selector = ','+selector;
}
if(sex>-1&&selector.indexOf(',1')==-1&&selector.indexOf(',0')==-1){ if(sex>-1&&selector.indexOf(',1')==-1&&selector.indexOf(',0')==-1){
selector = ','+sex+selector; selector = ','+sex+selector;
} }
@ -190,55 +259,6 @@ export function selector2id(selector,sex){
return unique(result); return unique(result);
}; };
// 通过ID获取数据
export function getItemsById(id){
var items = [];
var getData = function(d){
var res = [];
if(_data[d]){
res.push(_data[d][0]);
}else{
for(var i in _data){
if(i.replace(/&[ol]/g,'')==d){
res.push(_data[i][0]);
}else{
var expr = d;
while (expr.match(/[ol](b|s)/)){
expr = expr.replace(/[ol](b|s)/,'x$1');
if(expr==i){
res.push(_data[i][0]);
break;
}
}
}
}
}
return res;
};
if(_data[id]){ // 直接匹配称呼
items.push(_data[id][0]);
}else{
items = getData(id);
// 忽略年龄条件查找
if(!items.length){
id = id.replace(/&[ol]/g,'');
items = getData(id);
}
// 忽略年龄条件查找
if(!items.length){
id = id.replace(/[ol](b|s)/g,'x$1');
items = getData(id);
}
// 缩小访问查找
if(!items.length){
var l = id.replace(/x/g,'l');
var o = id.replace(/x/g,'o');
items = items.concat(getData(o),getData(l));
}
}
return items;
};
// 逆转ID // 逆转ID
export function reverseId(id,sex){ export function reverseId(id,sex){
var hash = { var hash = {
@ -296,89 +316,103 @@ export function reverseId(id,sex){
return ['']; return [''];
}; };
// 通过ID获取关系链条 // 通过ID获取关系称呼
export function getItemsById(id){
var items = [];
var getData = function(d){
var res = [];
if(_data[d]){
res.push(_data[d][0]);
}else{
for(var i in _data){
if(i.replace(/&[ol]/g,'')==d){
res.push(_data[i][0]);
}else{
var expr = d;
while (expr.match(/[ol](b|s)/)){
expr = expr.replace(/[ol](b|s)/,'x$1');
if(expr==i){
res.push(_data[i][0]);
break;
}
}
}
}
}
return res;
};
if(_data[id]){ // 直接匹配称呼
items.push(_data[id][0]);
}else{
items = getData(id);
// 忽略年龄条件查找
if(!items.length){
id = id.replace(/&[ol]/g,'');
items = getData(id);
}
// 忽略年龄条件查找
if(!items.length){
id = id.replace(/[ol](b|s)/g,'x$1');
items = getData(id);
}
// 缩小访问查找
if(!items.length){
var l = id.replace(/x/g,'l');
var o = id.replace(/x/g,'o');
items = items.concat(getData(o),getData(l));
}
}
return items;
};
// 通过ID获取关系链
export function getChainById(id){ export function getChainById(id){
var arr = id.split(','); var arr = id.split(',');
return arr.map(function(sign){ return arr.map(function(sign){
var key = sign.replace(/&[ol]/,''); var key = sign.replace(/&[ol]/,'');
var data = Object.assign({},_data,{ var data = Object.assign({},_data,{
'xb':['兄弟'], 'xb':['兄弟'],
'xs':['姐妹'], 'xs':['姐妹']
}); });
return data[key][0]; return data[key][0];
}).join('的'); }).join('的');
}; };
// 合并选择器,查找两个对象之间的关系 // 通过ID获取关系合称
export function mergeSelector(from,to,my_sex){ export function getPairsByIds(id1,id2){
if(my_sex<0){ var result = [];
var to_sex = -1; var result_r = [];
var from_sex = -1; for(var key in _pair){
if(from.match(/^,[w1]/)){ var selectors = key.split('#');
from_sex = 1; if(selectors.length>1){
}else if(from.match(/^,[h0]/)){ var list1 = selector2id(selectors[0]);
from_sex = 0; var list2 = selector2id(selectors[1]);
} var list1_r = list1.map(function(selector){
if(to.match(/^,[w1]/)){ return selector.replace(/&[o|l]/,'').replace(/[o|l]b/,'xb').replace(/[o|l]s/,'xs');
to_sex = 1; });
}else if(to.match(/^,[h0]/)){ var list2_r = list2.map(function(selector){
to_sex = 0; return selector.replace(/&[o|l]/,'').replace(/[o|l]b/,'xb').replace(/[o|l]s/,'xs');
} });
if(from_sex==-1&&to_sex>-1){ if(list1.indexOf(id1)>-1&&list2.indexOf(id2)>-1||list1.indexOf(id2)>-1&&list2.indexOf(id1)>-1){
my_sex = to_sex; result.push(_pair[key][0]);
}else if(from_sex>-1&&to_sex==-1){
my_sex = from_sex;
}else if(from_sex==to_sex){
my_sex = from_sex;
}else{
return false;
}
}
var sex = my_sex;
var from_ids = selector2id(from,my_sex);
var to_ids = selector2id(to,my_sex);
var to_rids = [];
if(!from_ids.length||!to_ids.length){
return false;
}
if(to){
var toIsMale = false;
var toIsFemale = false;
to_ids.forEach(function(id){
if(id.match(/([fhs1](&[ol])?|[olx]b)$/)){
toIsMale = true;
} }
if(id.match(/([mwd0](&[ol])?|[olx]s)$/)){ if(list1_r.indexOf(id1)>-1&&list2_r.indexOf(id2)>-1||list1_r.indexOf(id2)>-1&&list2_r.indexOf(id1)>-1){
toIsFemale = true; result_r.push(_pair[key][0]);
} }
to_rids = to_rids.concat(reverseId(id,my_sex));
});
to_rids = unique(to_rids);
if(toIsMale&&toIsFemale){
sex = -1;
}else if(toIsMale){
sex = 1;
}else if(toIsFemale){
sex = 0;
} }
}else{
to_rids = [''];
} }
// console.log('[from_ids]',from_ids,'to_rids',to_rids); if(!result.length){
var from_selector = from_ids.length>1?'['+from_ids.join('|')+']':from_ids[0]; result = result_r;
var to_selector = to_rids.length>1?'['+to_rids.join('|')+']':to_rids[0]; }
return { return result;
'selector':(to?','+to_selector:'')+(from?','+from_selector:''),
'sex':sex
};
}; };
// 设置模式 // 设置模式数据
export function setMode(sign,data){ export function setMode(sign,data){
_mode[sign] = Object.assign(_mode[sign]||{},data); _mode[sign] = Object.assign(_mode[sign]||{},data);
}; };
// 获取指定模式数据 // 获取模式数据
export function getDataByMode(sign){ export function getDataByMode(sign){
var data = Object.assign({},_map); var data = Object.assign({},_map);
if(sign&&_mode[sign]){ if(sign&&_mode[sign]){

49
src/pair.js Normal file
View File

@ -0,0 +1,49 @@
// 关系合称
export default {
'f#s':['父子'],
'm#s':['母子'],
'f#d':['父女'],
'm#d':['母女'],
'h#w':['夫妻'],
'ob#lb':['兄弟'],
'ob#ls':['兄妹'],
'os#ls':['姐妹'],
'os#lb':['姐弟'],
'w,f#d,h':['翁婿'],
'w,m#d,h':['母婿'],
'h,f#s,w':['翁媳'],
'h,m#s,w':['婆媳'],
'f,f#s,[s|d]':['公孙'],
'[f|m],[f|m]#[s|d],[s|d]':['祖孙'],
'f,xb#xb,[s|d]':['叔侄'],
'f,xb,w#h,xb,[s|d]':['叔侄'],
'f,xs#xb,[s|d]':['姑侄'],
'f,xs,h#w,xb,[s|d]':['姑侄'],
'm,xb#xs,[s|d]':['舅甥'],
'm,xb,w#h,xs,[s|d]':['舅甥'],
'm,xs#xs,[s|d]':['姨甥'],
'm,xs,h#w,xs,[s|d]':['姨甥'],
'f,xb,s&o#f,xb,s&l':['堂兄弟'],
'f,xb,s&o#f,xb,d&l':['堂兄妹'],
'f,xb,d&o#f,xb,s&l':['堂姐弟'],
'f,xb,d&o#f,xb,d&l':['堂姐妹'],
'f,xs,s&o#m,xb,s&l':['表兄弟'],
'm,xb,s&o#f,xs,s&l':['表兄弟'],
'f,xs,s&o#m,xb,d&l':['表兄妹'],
'm,xb,s&o#f,xs,d&l':['表兄妹'],
'f,xs,d&o#m,xb,d&l':['表姐妹'],
'm,xb,d&o#f,xs,d&l':['表姐妹'],
'f,xs,d&o#m,xb,s&l':['表姐弟'],
'm,xb,d&o#f,xs,s&l':['表姐弟'],
'm,xs,s&o#m,xs,s&l':['姨兄弟'],
'm,xs,s&o#m,xs,d&l':['姨兄妹'],
'm,xs,d&o#m,xs,s&l':['姨姐弟'],
'm,xs,d&o#m,xs,d&l':['姨姐妹'],
'h,ob,w#h,lb,w':['妯娌'],
'w,os,h#w,ob,h':['连襟','连桥'],
'xs,h#w,xb':['郎舅'],
'xs,h#w,xs':['郎姨'],
'xb,w#h,xb':['叔嫂'],
'xb,w#h,xs':['姑嫂'],
'd,h,[f|m]#s,w,[f|m]':['儿女亲家'],
}

View File

@ -1,15 +1,15 @@
import { import {
unique, unique,
getSelectors, getSelectors,
selector2id,
getItemsById,
reverseId,
getChainById,
mergeSelector, mergeSelector,
selector2id,
reverseId,
getItemsById,
getChainById,
getPairsByIds,
setMode, setMode,
getDataByMode getDataByMode
} from './method'; } from './method';
var _data = getDataByMode(); // 最终数据 var _data = getDataByMode(); // 最终数据
// 对外方法 // 对外方法
@ -51,17 +51,25 @@ var relationship = function (parameter){
if(options.type=='chain'){ if(options.type=='chain'){
temps.forEach(function(id){ temps.forEach(function(id){
var item = getChainById(id); var item = getChainById(id);
if(item){ if(data['sex']>-1&&_data[data['sex']+','+id]){
if(id.match(/^[^hw]/)){ if(data['sex']==0){
if(data['sex']==0){ item = '(女性)'+item;
item = '(女性)'+item; }else if(data['sex']==1){
}else if(data['sex']==1){ item = '(男性)'+item;
item = '(男性)'+item;
}
} }
}
if(item){
result.push(item); result.push(item);
} }
}); });
}else if(options.type=='pair'){
temps = reverseId(id,data['sex']);
temps.forEach(function(r_id){
var pairs = getPairsByIds(id,r_id);
if(pairs.length){
result = result.concat(pairs);
}
});
}else{ }else{
temps.forEach(function(id){ temps.forEach(function(id){
var items = getItemsById(id); var items = getItemsById(id);

View File

@ -27,5 +27,6 @@ test('relationship.js show to be tested', function (t) {
t.deepEqual(relationship({text:'我',target:'爸爸'}),['儿子','女儿']); t.deepEqual(relationship({text:'我',target:'爸爸'}),['儿子','女儿']);
t.deepEqual(relationship({text:'爱人',target:'娘家侄子'}),['姑丈']); t.deepEqual(relationship({text:'爱人',target:'娘家侄子'}),['姑丈']);
t.deepEqual(relationship({text:'岳母的配偶的孩子的爸爸'}),['岳父']); t.deepEqual(relationship({text:'岳母的配偶的孩子的爸爸'}),['岳父']);
t.deepEqual(relationship({text:'舅妈',target:'外婆',type:'pair'}),['婆媳']);
t.end(); t.end();
}); });