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
+2 -2
View File
File diff suppressed because one or more lines are too long
+2 -2
View File
File diff suppressed because one or more lines are too long
+2 -2
View File
@@ -1,12 +1,12 @@
{ {
"name": "relationship.js", "name": "relationship.js",
"version": "1.2.2", "version": "1.2.3",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "relationship.js", "name": "relationship.js",
"version": "1.2.2", "version": "1.2.3",
"license": "MIT", "license": "MIT",
"devDependencies": { "devDependencies": {
"gulp": "^4.0.2", "gulp": "^4.0.2",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "relationship.js", "name": "relationship.js",
"version": "1.2.2", "version": "1.2.3",
"summary": "relationship.js is a javascript library for chinese family relationship. 中国家庭亲戚称谓计算器,家庭关系、亲戚关系算法。", "summary": "relationship.js is a javascript library for chinese family relationship. 中国家庭亲戚称谓计算器,家庭关系、亲戚关系算法。",
"description": "Chinese kinship library", "description": "Chinese kinship library",
"author": "HaoLe Zheng", "author": "HaoLe Zheng",
+4 -26
View File
@@ -7,36 +7,14 @@ export default {
'{G2},w':['祖母'], '{G2},w':['祖母'],
'{G2},s':['父'], '{G2},s':['父'],
'{G2},s,w':['母'], '{G2},s,w':['母'],
'{G2},s,s':['兄弟'],
'{G2},s,s&o':['兄'], '{G2},s,s&o':['兄'],
'{G2},s,s&l':['弟'], '{G2},s,s&l':['弟'],
'{G2},s,s':['兄弟'], '{G2},s,d':['姊妹'],
'{G2},s,d&o':['姊'], '{G2},s,d&o':['姊'],
'{G2},s,d&l':['妹'], '{G2},s,d&l':['妹'],
'{G2},s,d':['姊妹'],
'{G2},s,s,s':['男','子'], '{G2},s,s,s':['男','子'],
'{G2},s,s,d':['女'], '{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}':['鼻祖父'],
'f,f,f,f,f,f,f,f,{G1M},w':['鼻祖母'], 'f,f,f,f,f,f,f,f,{G1M},w':['鼻祖母'],
@@ -125,8 +103,8 @@ export default {
'f,f,{G1},d,h':['姑祖父','姑爷爷'], 'f,f,{G1},d,h':['姑祖父','姑爷爷'],
'f,m,{G1},s':['舅祖父','舅爷爷'], 'f,m,{G1},s':['舅祖父','舅爷爷'],
'f,m,{G1},s,w':['舅祖母','舅奶奶'], 'f,m,{G1},s,w':['舅祖母','舅奶奶'],
'f,m,{G1},d':['姨祖母','姨爷爷'], 'f,m,{G1},d':['姨祖母','姨奶奶'],
'f,m,{G1},d,h':['姨祖父','姨奶奶'], 'f,m,{G1},d,h':['姨祖父','姨爷爷'],
'm,f,{G1},s&o':['伯外祖父','伯外公','伯姥爷'], 'm,f,{G1},s&o':['伯外祖父','伯外公','伯姥爷'],
'm,f,{G1},s&o,w':['伯外祖母','伯外婆','伯姥姥'], 'm,f,{G1},s&o,w':['伯外祖母','伯外婆','伯姥姥'],
'm,f,{G1},s&l':['叔外祖父','叔外公','叔姥爷'], 'm,f,{G1},s&l':['叔外祖父','叔外公','叔姥爷'],
+10 -4
View File
@@ -2,10 +2,6 @@
* 分支前缀 - 旁支亲戚的分支节点 * 分支前缀 - 旁支亲戚的分支节点
*/ */
export default { 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}':{ '{G2}':{
'f,f,xb':['从祖'], 'f,f,xb':['从祖'],
'm,f,xb':['外从祖'], 'm,f,xb':['外从祖'],
@@ -35,6 +31,8 @@ export default {
'm,m,m,xs,d,d':['三从母','三从'], 'm,m,m,xs,d,d':['三从母','三从'],
'f,f,f,f,xb,s,s,s':['四从父','三从堂','远堂','族','四从'], 'f,f,f,f,xb,s,s,s':['四从父','三从堂','远堂','族','四从'],
'm,m,m,m,xs,d,d,d':['四从母','四从'], '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}':{ '{G1M}':{
'f,ob':['伯'], 'f,ob':['伯'],
@@ -57,6 +55,12 @@ export default {
'm,f,xs,s':['姑表舅'], 'm,f,xs,s':['姑表舅'],
'm,m,xb,s':['舅表舅'], 'm,m,xb,s':['舅表舅'],
'm,m,xs,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}':{ '{G1W}':{
'f,xs':['姑'], 'f,xs':['姑'],
@@ -70,6 +74,8 @@ export default {
'm,f,xs,d':['姑表姨'], 'm,f,xs,d':['姑表姨'],
'm,m,xb,d':['舅表姨'], 'm,m,xb,d':['舅表姨'],
'm,m,xs,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}':{ '{G0}':{
'xb':['侄'], 'xb':['侄'],
+12 -17
View File
@@ -91,20 +91,15 @@ export function getItemsById(id){
res.push(_data[key][0]); res.push(_data[key][0]);
}else{ }else{
var ids = []; var ids = [];
for(var i in _data){ if(_data[key+'&o']){
if(i.replace(/&[ol]/g,'')==key){ ids.push(key+'&o');
// 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+'&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){ res = filterId(ids).map(function(id){
return _data[id][0]; return _data[id][0];
@@ -162,17 +157,17 @@ export function getItemsById(id){
}; };
// 通过ID获取关系链 // 通过ID获取关系链
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,{ var data = Object.assign({},_data,{
'xb':['兄弟'], 'xb':['兄弟'],
'xs':['姐妹'] 'xs':['姐妹']
}); });
export function getChainById(id,sex){
var arr = id.split(',');
var item = arr.map(function(sign){
var key = sign.replace(/&[ol\d]+/,'');
return data[key][0]; return data[key][0];
}).join('的'); }).join('的');
if(sex&&sex>-1&&_data[sex+','+id]){ if(sex&&sex>-1&&data[sex+','+id]){
if(sex==0){ if(sex==0){
item = '(女性)'+item; item = '(女性)'+item;
}else if(sex==1){ }else if(sex==1){
+31 -16
View File
@@ -11,22 +11,11 @@ import {
} from './selector'; } from './selector';
var _map = Object.assign({},_multipie); var _map = Object.assign({},_multipie);
var getMap = function(prefixMap,branch){
// 分支前缀处理 var map = {};
var prefixMap = {}; for(var key in branch){
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 tag = key.match(/\{.+?\}/)[0];
var nameList = _branch[key]; var nameList = branch[key];
for(var k in prefixMap[tag]){ for(var k in prefixMap[tag]){
var prefixList = prefixMap[tag][k]; var prefixList = prefixMap[tag][k];
var newKey = key.replace(tag,k); var newKey = key.replace(tag,k);
@@ -42,16 +31,42 @@ for(var key in _branch){
} }
}); });
}); });
_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){ for(var key in _main){
_map[key] = [].concat(_main[key],_map[key]||[]); _map[key] = [].concat(_main[key],_map[key]||[]);
} }
// 版权彩蛋 // 版权彩蛋
_map['o']=['passer-by.com','\u4f5c\u8005']; _map['o']=['passer-by.com','\u4f5c\u8005'];
// 配偶关系 // 配偶关系
var branch = { var branch = {
'w':['妻','内','岳','岳家','丈人'], 'w':['妻','内','岳','岳家','丈人'],
+42
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]||[];
};
};
+18 -10
View File
@@ -8,6 +8,7 @@ import _similar from './rule/similar';
import {zh2number} from './unit'; import {zh2number} from './unit';
import {reverseId,filterId,getGenById} from './id'; import {reverseId,filterId,getGenById} from './id';
import {modeData as _data} from './mode'; import {modeData as _data} from './mode';
import {quickSearch} from './search';
// 获得最简 // 获得最简
var getOptimal = function(options){ var getOptimal = function(options){
@@ -70,6 +71,8 @@ var getOptimal = function(options){
}; };
}; };
var search = new quickSearch(_data);
// 中文获取选择器 // 中文获取选择器
export function getSelectors(str){ export function getSelectors(str){
str = str.replace(/之/g,'的').replace(/吾之?(.+)/,'$1').replace(/我的?(.+)/,'$1'); str = str.replace(/之/g,'的').replace(/吾之?(.+)/,'$1').replace(/我的?(.+)/,'$1');
@@ -123,24 +126,29 @@ export function getSelectors(str){
var x_name = name.replace(match[0],'几'); var x_name = name.replace(match[0],'几');
var r_name = name.replace(match[0],''); var r_name = name.replace(match[0],'');
var num = zh2number(match[0]); var num = zh2number(match[0]);
for(var i in _data){ 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); var r_i = i.replace(/(,[hw])$/,'&'+num+'$1').replace(/([^hw]+)$/,'$1&'+num);
if(_data[i].includes(x_name)){
x_items.push(r_i); 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(/^[从世]/)){ // 直系祖辈不参与排序 if(!i.match(/^[mf,]+$/)&&!r_name.match(/^[从世]/)){ // 直系祖辈不参与排序
r_items.push(r_i); 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); i_items.push(r_i);
});
} }
} }
} items = items.concat(search.getKeyByName(name));
for(var i in _data){
if(_data[i].includes(name)){
items.push(i);
}
}
}); });
// console.log('[keywords]',keywords); // console.log('[keywords]',keywords);
// 如找不到结果,再是否存在称呼的排行问题(不直接判断,因存在"大舅""三从父兄""三世祖"这样特俗含义的情况) // 如找不到结果,再是否存在称呼的排行问题(不直接判断,因存在"大舅""三从父兄""三世祖"这样特俗含义的情况)