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

View File

@@ -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':['小舅','小舅舅','舅仔','舅父仔','幺舅','老舅','细舅','满舅','尕阿舅'],

View File

@@ -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;
// 通过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');
});
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]);
}
if(id.match(/([mwd0](&[ol])?|[olx]s)$/)){
toIsFemale = true;
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]);
}
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
};
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
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 {
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']==0){
item = '(女性)'+item;
}else if(data['sex']==1){
item = '(男性)'+item;
}
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);