updated bue修复及功能添加
修复两者称谓性别判断s和xs逻辑问题,及关系链输出性别参数带出等问题; 添加合称功能
This commit is contained in:
parent
0a707df25b
commit
72d0eef45d
2
dist/relationship.min.js
vendored
2
dist/relationship.min.js
vendored
File diff suppressed because one or more lines are too long
2
dist/relationship.zh-HK.min.js
vendored
2
dist/relationship.zh-HK.min.js
vendored
File diff suppressed because one or more lines are too long
17
readme.md
17
readme.md
@ -35,7 +35,7 @@ var options = {
|
||||
text:'', //目标对象:目标对象的称谓汉字表达,称谓间用‘的’字分隔
|
||||
target:'', //相对对象:相对对象的称谓汉字表达,称谓间用‘的’字分隔,空表示自己
|
||||
sex:-1, //本人性别:0表示女性,1表示男性
|
||||
type:'default', //转换类型:'default'计算称谓,'chain'计算关系
|
||||
type:'default', //转换类型:'default'计算称谓,'chain'计算关系链,'pair'计算关系合称
|
||||
reverse:false, //称呼方式:true对方称呼我,false我称呼对方
|
||||
mode:'default' //模式选择:使用setMode方法定制不同地区模式,在此选择自定义模式
|
||||
};
|
||||
@ -46,15 +46,24 @@ var options = {
|
||||
```js
|
||||
// 如:我应该叫外婆的哥哥什么?
|
||||
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:'奶奶',type:'pair'});
|
||||
// => ['儿女亲家']
|
||||
|
||||
```
|
||||
2. 内部属性:获取当前数据表 `relationship.data`.
|
||||
|
||||
|
@ -227,7 +227,7 @@ export default {
|
||||
'm,m,xs':['姨外婆','姨婆'],
|
||||
'm,m,xs,h':['姨外公','姨公','外姨丈公','外丈公'],
|
||||
// 父系
|
||||
'f':['爸爸','父亲','老爸','阿爸','阿父','阿爹','老窦','爹地','依爹','老爹','老汉','老爷子','老子','牙老子','爸','父','爹','老汉儿','牙老倌','爸比','爹爹','爹啲','一世祖'],
|
||||
'f':['爸爸','父亲','老父亲','老爸','阿爸','阿父','阿爹','老窦','爹地','依爹','老爹','老汉','老爷子','老子','牙老子','爸','父','爹','老汉儿','牙老倌','爸比','爹爹','爹啲','一世祖'],
|
||||
'f,ob':['伯父','伯伯','伯爸','伯爷','依伯','世父','大爷','大爸','大爸爸','大爹','伯儿','大伯','大大','阿伯','伯'],
|
||||
'f,ob,w':['伯母','伯妈','伯娘','依姆','世母','大娘','大妈','大妈妈','大嬷','伯妇','大嬷','大姆妈','伯姐','姆'],
|
||||
'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],w':['族伯叔母','三从母','族母'],
|
||||
// 母系
|
||||
'm':['妈妈','母亲','老妈','阿妈','阿母','阿娘','老母','妈咪','依妈','老娘','老乸','老妈子','妈子','娘老子','妈','母','娘','阿毑','姆嬷','姆妈','娘亲'],
|
||||
'm':['妈妈','母亲','老母亲','老妈','阿妈','阿母','阿娘','老母','妈咪','依妈','老娘','老乸','老妈子','妈子','娘老子','妈','母','娘','阿毑','姆嬷','姆妈','娘亲'],
|
||||
'm,ob':['大舅','大舅舅','舅伯','元舅'],
|
||||
'm,ob,w':['大舅妈','大妗','舅嫲'],
|
||||
'm,lb':['小舅','小舅舅','舅仔','舅父仔','幺舅','老舅','细舅','满舅','尕阿舅'],
|
||||
|
258
src/method.js
258
src/method.js
@ -1,6 +1,7 @@
|
||||
// 通用方法
|
||||
import _filter from './filter';
|
||||
import _map from './map';
|
||||
import _pair from './pair';
|
||||
|
||||
var _mode = {}; // 模式数据
|
||||
var _data = Object.assign({},_map); // 最终数据
|
||||
@ -137,6 +138,71 @@ export function getSelectors(str){
|
||||
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
|
||||
export function selector2id(selector,sex){
|
||||
var result = [];
|
||||
@ -158,6 +224,9 @@ export function selector2id(selector,sex){
|
||||
}
|
||||
// console.log('[selector]',selector);
|
||||
var getId = function(selector,sex){
|
||||
if(!selector.match(/^,/)){
|
||||
selector = ','+selector;
|
||||
}
|
||||
if(sex>-1&&selector.indexOf(',1')==-1&&selector.indexOf(',0')==-1){
|
||||
selector = ','+sex+selector;
|
||||
}
|
||||
@ -190,55 +259,6 @@ export function selector2id(selector,sex){
|
||||
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
|
||||
export function reverseId(id,sex){
|
||||
var hash = {
|
||||
@ -296,89 +316,103 @@ export function reverseId(id,sex){
|
||||
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){
|
||||
var arr = id.split(',');
|
||||
return arr.map(function(sign){
|
||||
var key = sign.replace(/&[ol]/,'');
|
||||
var data = Object.assign({},_data,{
|
||||
'xb':['兄弟'],
|
||||
'xs':['姐妹'],
|
||||
'xs':['姐妹']
|
||||
});
|
||||
return data[key][0];
|
||||
}).join('的');
|
||||
};
|
||||
|
||||
// 合并选择器,查找两个对象之间的关系
|
||||
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){
|
||||
if(id.match(/([fhs1](&[ol])?|[olx]b)$/)){
|
||||
toIsMale = true;
|
||||
}
|
||||
if(id.match(/([mwd0](&[ol])?|[olx]s)$/)){
|
||||
toIsFemale = true;
|
||||
}
|
||||
to_rids = to_rids.concat(reverseId(id,my_sex));
|
||||
// 通过ID获取关系合称
|
||||
export function getPairsByIds(id1,id2){
|
||||
var result = [];
|
||||
var result_r = [];
|
||||
for(var key in _pair){
|
||||
var selectors = key.split('#');
|
||||
if(selectors.length>1){
|
||||
var list1 = selector2id(selectors[0]);
|
||||
var list2 = selector2id(selectors[1]);
|
||||
var list1_r = list1.map(function(selector){
|
||||
return selector.replace(/&[o|l]/,'').replace(/[o|l]b/,'xb').replace(/[o|l]s/,'xs');
|
||||
});
|
||||
to_rids = unique(to_rids);
|
||||
if(toIsMale&&toIsFemale){
|
||||
sex = -1;
|
||||
}else if(toIsMale){
|
||||
sex = 1;
|
||||
}else if(toIsFemale){
|
||||
sex = 0;
|
||||
var list2_r = list2.map(function(selector){
|
||||
return selector.replace(/&[o|l]/,'').replace(/[o|l]b/,'xb').replace(/[o|l]s/,'xs');
|
||||
});
|
||||
if(list1.indexOf(id1)>-1&&list2.indexOf(id2)>-1||list1.indexOf(id2)>-1&&list2.indexOf(id1)>-1){
|
||||
result.push(_pair[key][0]);
|
||||
}
|
||||
}else{
|
||||
to_rids = [''];
|
||||
if(list1_r.indexOf(id1)>-1&&list2_r.indexOf(id2)>-1||list1_r.indexOf(id2)>-1&&list2_r.indexOf(id1)>-1){
|
||||
result_r.push(_pair[key][0]);
|
||||
}
|
||||
// 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
|
||||
};
|
||||
}
|
||||
}
|
||||
if(!result.length){
|
||||
result = result_r;
|
||||
}
|
||||
return result;
|
||||
};
|
||||
|
||||
// 设置模式
|
||||
// 设置模式数据
|
||||
export function setMode(sign,data){
|
||||
_mode[sign] = Object.assign(_mode[sign]||{},data);
|
||||
};
|
||||
|
||||
// 获取指定模式数据
|
||||
// 获取模式数据
|
||||
export function getDataByMode(sign){
|
||||
var data = Object.assign({},_map);
|
||||
if(sign&&_mode[sign]){
|
||||
|
49
src/pair.js
Normal file
49
src/pair.js
Normal 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]':['儿女亲家'],
|
||||
}
|
@ -1,15 +1,15 @@
|
||||
import {
|
||||
unique,
|
||||
getSelectors,
|
||||
selector2id,
|
||||
getItemsById,
|
||||
reverseId,
|
||||
getChainById,
|
||||
mergeSelector,
|
||||
selector2id,
|
||||
reverseId,
|
||||
getItemsById,
|
||||
getChainById,
|
||||
getPairsByIds,
|
||||
setMode,
|
||||
getDataByMode
|
||||
} from './method';
|
||||
|
||||
var _data = getDataByMode(); // 最终数据
|
||||
|
||||
// 对外方法
|
||||
@ -51,17 +51,25 @@ var relationship = function (parameter){
|
||||
if(options.type=='chain'){
|
||||
temps.forEach(function(id){
|
||||
var item = getChainById(id);
|
||||
if(item){
|
||||
if(id.match(/^[^hw]/)){
|
||||
if(data['sex']>-1&&_data[data['sex']+','+id]){
|
||||
if(data['sex']==0){
|
||||
item = '(女性)'+item;
|
||||
}else if(data['sex']==1){
|
||||
item = '(男性)'+item;
|
||||
}
|
||||
}
|
||||
if(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{
|
||||
temps.forEach(function(id){
|
||||
var items = getItemsById(id);
|
||||
|
@ -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:'岳母的配偶的孩子的爸爸'}),['岳父']);
|
||||
t.deepEqual(relationship({text:'舅妈',target:'外婆',type:'pair'}),['婆媳']);
|
||||
t.end();
|
||||
});
|
||||
|
Loading…
x
Reference in New Issue
Block a user