updated 重表关系添加,检索优化

增加快速检索功能
This commit is contained in:
PASSER-BY 2022-12-09 00:32:43 +08:00
parent 470ee24c45
commit 8e0475864a
10 changed files with 142 additions and 98 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

4
package-lock.json generated
View File

@ -1,12 +1,12 @@
{
"name": "relationship.js",
"version": "1.2.2",
"version": "1.2.3",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "relationship.js",
"version": "1.2.2",
"version": "1.2.3",
"license": "MIT",
"devDependencies": {
"gulp": "^4.0.2",

View File

@ -1,6 +1,6 @@
{
"name": "relationship.js",
"version": "1.2.2",
"version": "1.2.3",
"summary": "relationship.js is a javascript library for chinese family relationship. 中国家庭亲戚称谓计算器,家庭关系、亲戚关系算法。",
"description": "Chinese kinship library",
"author": "HaoLe Zheng",

View File

@ -7,36 +7,14 @@ export default {
'{G2},w':['祖母'],
'{G2},s':['父'],
'{G2},s,w':['母'],
'{G2},s,s':['兄弟'],
'{G2},s,s&o':['兄'],
'{G2},s,s&l':['弟'],
'{G2},s,s':['兄弟'],
'{G2},s,d':['姊妹'],
'{G2},s,d&o':['姊'],
'{G2},s,d&l':['妹'],
'{G2},s,d':['姊妹'],
'{G2},s,s,s':['男','子'],
'{G2},s,s,d':['女'],
'{G2C},s&o':['伯父'],
'{G2C},s&o,w':['伯母'],
'{G2C},s&l':['叔父'],
'{G2C},s&l,w':['叔母'],
'{G2C},s,s&o':['兄'],
'{G2C},s,s&l':['弟'],
'{G2C},s,s,s':['侄男'],
'{G2C},s,s,d':['侄女'],
'{G2C},s,d&o':['姐'],
'{G2C},s,d&l':['妹'],
'{G2C},s,d,s':['甥男'],
'{G2C},s,d,d':['甥女'],
'{G2C},d':['姑母'],
'{G2C},d,h':['姑父'],
'{G2C},d,s&o':['兄'],
'{G2C},d,s&l':['弟'],
'{G2C},d,s,s':['侄男'],
'{G2C},d,s,d':['侄女'],
'{G2C},d,d&o':['姐'],
'{G2C},d,d&l':['妹'],
'{G2C},d,d,s':['甥男'],
'{G2C},d,d,d':['甥女'],
// 高祖以上
'f,f,f,f,f,f,f,f,{G1M}':['鼻祖父'],
'f,f,f,f,f,f,f,f,{G1M},w':['鼻祖母'],
@ -125,8 +103,8 @@ export default {
'f,f,{G1},d,h':['姑祖父','姑爷爷'],
'f,m,{G1},s':['舅祖父','舅爷爷'],
'f,m,{G1},s,w':['舅祖母','舅奶奶'],
'f,m,{G1},d':['姨祖母','姨爷爷'],
'f,m,{G1},d,h':['姨祖父','姨奶奶'],
'f,m,{G1},d':['姨祖母','姨奶奶'],
'f,m,{G1},d,h':['姨祖父','姨爷爷'],
'm,f,{G1},s&o':['伯外祖父','伯外公','伯姥爷'],
'm,f,{G1},s&o,w':['伯外祖母','伯外婆','伯姥姥'],
'm,f,{G1},s&l':['叔外祖父','叔外公','叔姥爷'],

View File

@ -2,10 +2,6 @@
* 分支前缀 - 旁支亲戚的分支节点
*/
export default {
'{G2C}':{
'[f|m],[f|m],[f|m],[f,xs|m,xb|m,xs],[s|d],[s|d]':['重表'], // 曾祖辈的表兄弟姐妹的子女
'[f|m],[f|m],[f,xs|m,xb|m,xs],[s|d]':['重表'], // 祖辈的表兄弟姐妹的子女
},
'{G2}':{
'f,f,xb':['从祖'],
'm,f,xb':['外从祖'],
@ -35,6 +31,8 @@ export default {
'm,m,m,xs,d,d':['三从母','三从'],
'f,f,f,f,xb,s,s,s':['四从父','三从堂','远堂','族','四从'],
'm,m,m,m,xs,d,d,d':['四从母','四从'],
'[f|m],[f|m],[f|m],[f,xs|m,xb],[s|d],[s|d],[s|d]':['重表'],
'[f|m],[f|m],[f,xs|m,xb],[s|d],[s|d]':['重表'],
},
'{G1M}':{
'f,ob':['伯'],
@ -57,6 +55,12 @@ export default {
'm,f,xs,s':['姑表舅'],
'm,m,xb,s':['舅表舅'],
'm,m,xs,s':['姨舅','从母舅'],
'f,[f|m],[f|m],[f,xs|m,xb],[s|d],[s|d],s&o':['重表伯'],
'f,[f|m],[f|m],[f,xs|m,xb],[s|d],[s|d],s&l':['重表叔'],
'f,[f|m],[f,xs|m,xb],[s|d],s&o':['重表伯'],
'f,[f|m],[f,xs|m,xb],[s|d],s&l':['重表叔'],
'm,[f|m],[f|m],[f,xs|m,xb],[s|d],[s|d],s':['重表舅'],
'm,[f|m],[f,xs|m,xb],[s|d],s':['重表舅'],
},
'{G1W}':{
'f,xs':['姑'],
@ -70,6 +74,8 @@ export default {
'm,f,xs,d':['姑表姨'],
'm,m,xb,d':['舅表姨'],
'm,m,xs,d':['姨姨','从母姨'],
'f,[f|m],[f|m],[f,xs|m,xb],[s|d],[s|d],d':['重表姑'],
'm,[f|m],[f|m],[f,xs|m,xb],[s|d],[s|d],d':['重表姨'],
},
'{G0}':{
'xb':['侄'],

View File

@ -91,20 +91,15 @@ export function getItemsById(id){
res.push(_data[key][0]);
}else{
var ids = [];
for(var i in _data){
if(i.replace(/&[ol]/g,'')==key){
// res.push(_data[i][0]);
ids.push(i);
}else{
while (key.match(/[ol](b|s)/)){
key = key.replace(/[ol](b|s)/,'x$1');
if(key==i){
// res.push(_data[i][0]);
ids.push(i);
break;
}
}
}
if(_data[key+'&o']){
ids.push(key+'&o');
}
if(_data[key+'&l']){
ids.push(key+'&l');
}
var k = key.replace(/[ol](b|s)/,'x$1');
if(_data[k]){
ids.push(k);
}
res = filterId(ids).map(function(id){
return _data[id][0];
@ -162,17 +157,17 @@ export function getItemsById(id){
};
// 通过ID获取关系链
var data = Object.assign({},_data,{
'xb':['兄弟'],
'xs':['姐妹']
});
export function getChainById(id,sex){
var arr = id.split(',');
var item = arr.map(function(sign){
var key = sign.replace(/&[ol\d]+/,'');
var data = Object.assign({},_data,{
'xb':['兄弟'],
'xs':['姐妹']
});
return data[key][0];
}).join('的');
if(sex&&sex>-1&&_data[sex+','+id]){
if(sex&&sex>-1&&data[sex+','+id]){
if(sex==0){
item = '(女性)'+item;
}else if(sex==1){

View File

@ -11,47 +11,62 @@ import {
} from './selector';
var _map = Object.assign({},_multipie);
// 分支前缀处理
var prefixMap = {};
for(var key in _prefix){
prefixMap[key] = {};
for(var selector in _prefix[key]){
expandSelector(selector).forEach(function(s){
prefixMap[key][s] = _prefix[key][selector];
});
}
}
// 分支关系
for(var key in _branch){
var tag = key.match(/\{.+?\}/)[0];
var nameList = _branch[key];
for(var k in prefixMap[tag]){
var prefixList = prefixMap[tag][k];
var newKey = key.replace(tag,k);
var isFilter = ['h,h','w,w','w,h','h,w'].some(pair=>(newKey.includes(pair)));
var newList = [];
if(!isFilter){
prefixList.forEach(function(prefix){
nameList.forEach(function(name){
if(name.includes('?')){
newList.push(name.replace('?',prefix));
}else{
newList.push(prefix+name);
}
var getMap = function(prefixMap,branch){
var map = {};
for(var key in branch){
var tag = key.match(/\{.+?\}/)[0];
var nameList = branch[key];
for(var k in prefixMap[tag]){
var prefixList = prefixMap[tag][k];
var newKey = key.replace(tag,k);
var isFilter = ['h,h','w,w','w,h','h,w'].some(pair=>(newKey.includes(pair)));
var newList = [];
if(!isFilter){
prefixList.forEach(function(prefix){
nameList.forEach(function(name){
if(name.includes('?')){
newList.push(name.replace('?',prefix));
}else{
newList.push(prefix+name);
}
});
});
});
_map[newKey] = [].concat(_map[newKey]||[],newList);
map[newKey] = [].concat(_map[newKey]||[],newList);
}
}
}
return map;
};
// 分支前缀处理
var prefixMap1 = {};
for(var key in _prefix){
prefixMap1[key] = {};
for(var selector in _prefix[key]){
if(selector.indexOf(']')==-1){
prefixMap1[key][selector] = _prefix[key][selector];
}
}
}
var prefixMap2 = {};
for(var key in _prefix){
prefixMap2[key] = {};
for(var selector in _prefix[key]){
if(selector.indexOf(']')>-1){
expandSelector(selector).forEach(function(s){
prefixMap2[key][s] = _prefix[key][selector];
});
}
}
}
_map = Object.assign({},_map,getMap(prefixMap1,_branch),getMap(prefixMap2,_branch));
// 主要关系
for(var key in _main){
_map[key] = [].concat(_main[key],_map[key]||[]);
}
// 版权彩蛋
_map['o']=['passer-by.com','\u4f5c\u8005'];
// 配偶关系
var branch = {
'w':['妻','内','岳','岳家','丈人'],

42
src/module/search.js Normal file
View File

@ -0,0 +1,42 @@
// 数据快速搜索
export function quickSearch(map){
var _ = this;
var _cacheKey = {};
var _cacheValue = {};
var groupLength = ~~Math.sqrt(Object.entries(map).length);
// 索引分组
var getGroupIndex = function(key){
var arr = key.replace(/,/g,'').split('').map(value=>value.codePointAt(0));
if(arr.length>1){
return arr.reduce((a,b)=>(a+b))%groupLength;
}
return 0;
};
// 建立缓存表
for(var key in map){
var keyIndex = getGroupIndex(key);
if(typeof _cacheKey[keyIndex]=='undefined'){
_cacheKey[keyIndex] = {};
}
_cacheKey[keyIndex][key] = map[key];
map[key].forEach(function(name){
var valueIndex = getGroupIndex(name);
if(typeof _cacheValue[valueIndex]=='undefined'){
_cacheValue[valueIndex] = {};
}
if(typeof _cacheValue[valueIndex][name]=='undefined'){
_cacheValue[valueIndex][name] = [];
}
_cacheValue[valueIndex][name].push(key);
});
}
// 查询方法
_.getNameByKey = function(key){
var keyIndex = getGroupIndex(key);
return _cacheKey[keyIndex][key]||[];
};
_.getKeyByName = function(name){
var valueIndex = getGroupIndex(name);
return _cacheValue[valueIndex][name]||[];
};
};

View File

@ -8,6 +8,7 @@ import _similar from './rule/similar';
import {zh2number} from './unit';
import {reverseId,filterId,getGenById} from './id';
import {modeData as _data} from './mode';
import {quickSearch} from './search';
// 获得最简
var getOptimal = function(options){
@ -70,6 +71,8 @@ var getOptimal = function(options){
};
};
var search = new quickSearch(_data);
// 中文获取选择器
export function getSelectors(str){
str = str.replace(/之/g,'的').replace(/吾之?(.+)/,'$1').replace(/我的?(.+)/,'$1');
@ -123,24 +126,29 @@ export function getSelectors(str){
var x_name = name.replace(match[0],'几');
var r_name = name.replace(match[0],'');
var num = zh2number(match[0]);
for(var i in _data){
var r_i = i.replace(/(,[hw])$/,'&'+num+'$1').replace(/([^hw]+)$/,'$1&'+num);
if(_data[i].includes(x_name)){
var x_ids = search.getKeyByName(x_name);
var r_ids = search.getKeyByName(r_name);
var i_ids = search.getKeyByName(name);
if(x_ids.length){
x_ids.forEach(function(i){
var r_i = i.replace(/(,[hw])$/,'&'+num+'$1').replace(/([^hw]+)$/,'$1&'+num);
x_items.push(r_i);
}else if(_data[i].includes(r_name)){
});
}else if(r_ids.length){
r_ids.forEach(function(i){
var r_i = i.replace(/(,[hw])$/,'&'+num+'$1').replace(/([^hw]+)$/,'$1&'+num);
if(!i.match(/^[mf,]+$/)&&!r_name.match(/^[从世]/)){ // 直系祖辈不参与排序
r_items.push(r_i);
}
}else if(_data[i].includes(name)){
});
}else{
i_ids.forEach(function(i){
var r_i = i.replace(/(,[hw])$/,'&'+num+'$1').replace(/([^hw]+)$/,'$1&'+num);
i_items.push(r_i);
}
}
}
for(var i in _data){
if(_data[i].includes(name)){
items.push(i);
});
}
}
items = items.concat(search.getKeyByName(name));
});
// console.log('[keywords]',keywords);
// 如找不到结果,再是否存在称呼的排行问题(不直接判断,因存在"大舅""三从父兄""三世祖"这样特俗含义的情况)