106 lines
4.4 KiB
JavaScript
106 lines
4.4 KiB
JavaScript
import {
|
||
unique,
|
||
getSelectors,
|
||
mergeSelector,
|
||
selector2id,
|
||
reverseId,
|
||
getItemsById,
|
||
getChainById,
|
||
getPairsByIds,
|
||
setMode,
|
||
getDataByMode
|
||
} from './method';
|
||
var _data = getDataByMode(); // 最终数据
|
||
|
||
// 对外方法
|
||
var relationship = function (parameter){
|
||
var options = Object.assign({
|
||
text:'', // 目标对象:目标对象的称谓汉字表达,称谓间用‘的’字分隔
|
||
target:'', // 相对对象:相对对象的称谓汉字表达,称谓间用‘的’字分隔,空表示自己
|
||
sex:-1, // 本人性别:0表示女性,1表示男性
|
||
type:'default', // 转换类型:'default'计算称谓,'chain'计算关系链,'pair'计算关系合称
|
||
reverse:false, // 称呼方式:true对方称呼我,false我称呼对方
|
||
mode:'default', // 模式选择:使用setMode方法定制不同地区模式,在此选择自定义模式
|
||
optimal:false // 最短关系:计算两者之间的最短关系
|
||
},parameter);
|
||
_data = getDataByMode(options.mode);
|
||
var from_selectors = getSelectors(options.text);
|
||
var to_selectors = getSelectors(options.target);
|
||
if(!to_selectors.length){
|
||
to_selectors = [''];
|
||
}
|
||
var result = []; //匹配结果
|
||
// console.log('[selectors]',from_selectors,to_selectors);
|
||
from_selectors.forEach(function(from_selector){
|
||
to_selectors.forEach(function(to_selector){
|
||
var list = mergeSelector({
|
||
from:from_selector,
|
||
to:to_selector,
|
||
sex:options.sex,
|
||
optimal:options.optimal
|
||
});
|
||
list.forEach(function(data){
|
||
// console.log('[data]',from_selector,to_selector,data);
|
||
var ids = data?selector2id(data['selector'],data['sex']):null;
|
||
// console.log('[ids]',data['selector'],data['sex'],ids);
|
||
if(ids){
|
||
ids.forEach(function(id){
|
||
var temps = [id];
|
||
var sex = data['sex'];
|
||
if(options.reverse){
|
||
temps = reverseId(id,sex);
|
||
if(id.match(/([fhs1](&[ol])?|[olx]b)$/)){
|
||
sex = 1;
|
||
}else{
|
||
sex = 0;
|
||
}
|
||
}
|
||
if(options.type=='chain'){
|
||
temps.forEach(function(id){
|
||
var item = getChainById(id);
|
||
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);
|
||
if(!items.length){
|
||
items = getItemsById(sex+','+id);
|
||
}
|
||
if(items.length){
|
||
result = result.concat(items);
|
||
}
|
||
});
|
||
}
|
||
});
|
||
}
|
||
});
|
||
});
|
||
});
|
||
return unique(result);
|
||
};
|
||
// 获取数据表
|
||
relationship.data = _data;
|
||
// 获取数据量
|
||
relationship.dataCount = Object.keys(_data).length;
|
||
// 设置语言模式
|
||
relationship.setMode = setMode;
|
||
|
||
export default relationship;
|