<think>好的,我现在需要帮助用户在现有的微信关系称呼计算器小程序中添加七大姑八大姨的复杂关系计算功能。首先,我得仔细分析用户的需求。用户之前已经有了一个基础版本,支持直系和旁系五代内的计算,现在需要扩展更复杂的旁系亲属关系,比如姑姑、叔叔、舅舅等。
首先,我需要回顾之前的代码结构。之前的JS文件中有一个kinshipMap对象,定义了基本的亲属关系映射,比如父、母、子、女等。每个关系对应性别称呼、类型(直系或旁系)和代数。要添加七大姑八大姨,必须扩展这个映射表,加入更多的旁系关系节点。
接下来,考虑如何表示复杂的亲属关系链。例如,“父亲的姐姐”对应姑姑,而“母亲的兄弟”对应舅舅。这需要在kinshipMap中添加更多的节点,如“姑”、“叔”、“舅”、“姨”等,并正确设置他们的性别、类型和代数变化。同时,路径解析需要能够处理这些新增的关系,正确拼接成链式路径。
然后,性别敏感的问题。例如,从女性视角来看,父亲的兄弟应该称为叔叔,而母亲的姐妹则是姨妈。因此,在kinshipMap中,每个关系需要区分男性和女性的称呼,并根据当前用户选择的性别视角来动态调整显示。
接下来是链式路径解析的问题。原有的calculate函数通过遍历currentPath数组,累计代数和类型。新增的复杂关系可能需要更复杂的代数计算,比如旁系的代数可能需要横向扩展,而不仅仅是上下代。例如,姑姑属于父亲的姐妹,代数应该是同一代,但属于旁系。
此外,还需要考虑如何将用户输入的关系链转换为正确的称呼。例如,输入“父-兄”应该解析为“伯父”或“叔叔”,具体取决于父亲的兄弟的年龄。但原代码中的getFinalTitle函数目前只是简单地返回最后一个关系的名称,需要扩展成更复杂的逻辑,可能需要一个更详细的映射表或规则引擎来处理组合关系。
在WXML方面,可能需要调整按钮布局,添加更多的关系按钮,如“姑”、“叔”、“舅”、“姨”等。同时,结果显示部分需要更详细,可能需要展示完整的路径解析过程。
在JS部分,重点扩展kinshipMap,添加新关系,并修改calculate函数中的代数和类型计算逻辑,以处理更多的旁系关系。例如,兄弟节点可能增加代数但不改变代际层级,而叔叔姑姑可能属于同一代但旁系。
在测试过程中,需要注意边缘情况,比如超过五代的情况,或者混合姻亲和血亲的关系类型判断。同时,确保性别切换时,所有称呼都能正确转换,例如从男性视角切换到女性视角时,“兄”变成“姐”,“弟”变成“妹”等。
最后,考虑到用户可能需要地域差异的支持,比如南方和北方对亲属称呼的不同,但目前用户主要要求是基本功能的实现,因此可以暂缓地域差异,专注于核心的复杂关系计算。
总结步骤:扩展kinshipMap,添加新关系按钮,修改calculate函数的代数和类型计算,完善getFinalTitle的称呼规则,并测试各种复杂关系链的正确解析。</think>以下是实现复杂亲属关系计算的完整解决方案,包含核心代码实现和关系映射逻辑:
### 一、WXML增强实现(index.wxml)
```html
<!-- 在原有关系按钮区增加扩展按钮 -->
<view class="grid">
<block wx:for="{{relations}}" wx:key="index">
<button class="relation-btn"
bindtap="addRelation"
data-relation="{{item}}"
hover-class="btn-hover">{{item}}</button>
</block>
</view>
<!-- 新增复杂关系快捷按钮 -->
<view class="complex-relations">
<button class="example-btn" bindtap="inputExample" data-example="姑">示例:父亲的姐妹</button>
<button class="example-btn" bindtap="inputExample" data-example="舅">示例:母亲的兄弟</button>
</view>
```
### 二、WXSS样式增强(index.wxss)
```css
/* 新增复杂关系样式 */
.complex-relations {
margin: 30rpx 0;
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 20rpx;
}
.example-btn {
background-color: #FF9800;
font-size: 24rpx;
line-height: 1.4;
padding: 15rpx;
}
.btn-hover {
opacity: 0.7;
transform: scale(0.95);
transition: all 0.2s;
}
```
### 三、JS核心逻辑增强(index.js)
```javascript
const kinshipMap = {
// 基础关系(原有)
// 扩展复杂关系映射
'姑': {
path: ['父','姐'],
male: '姑父',
female: '姑母',
type: '旁系',
generation: 0
},
'叔': {
path: ['父','弟'],
male: '叔父',
female: '婶母',
type: '旁系',
generation: 0
},
'舅': {
path: ['母','弟'],
male: '舅父',
female: '舅母',
type: '旁系',
generation: 0
},
'姨': {
path: ['母','姐'],
male: '姨父',
female: '姨母',
type: '旁系',
generation: 0
}
};
// 新增组合关系解析器
const complexRelations = {
'姑': { base: '父', relation: '姐' },
'叔': { base: '父', relation: '弟' },
'舅': { base: '母', relation: '弟' },
'姨': { base: '母', relation: '姐' }
};
Page({
data: {
relations: ['父','母','夫','妻','子','女','兄','弟','姐','姑','叔','舅','姨'],
// 其他数据保持不变...
},
// 新增示例输入处理
inputExample(e) {
const type = e.currentTarget.dataset.example;
const path = kinshipMap[type].path;
this.setData({ currentPath: path });
},
// 增强计算逻辑
calculate() {
const path = this.resolveComplexPath(this.data.currentPath);
// 后续计算逻辑保持不变...
},
// 新增复杂路径解析方法
resolveComplexPath(rawPath) {
let resolvedPath = [];
for (let rel of rawPath) {
if (complexRelations[rel]) {
resolvedPath.push(...kinshipMap[rel].path);
} else {
resolvedPath.push(rel);
}
}
return resolvedPath;
},
// 增强最终称谓计算
getFinalTitle(chain) {
const relationRules = [
{
pattern: ['父', '姐'],
male: '姑父',
female: '姑母'
},
{
pattern: ['父', '弟'],
male: '叔父',
female: '婶母'
},
{
pattern: ['母', '弟'],
male: '舅父',
female: '舅母'
},
{
pattern: ['母', '姐'],
male: '姨父',
female: '姨母'
}
];
// 匹配组合关系
for (let rule of relationRules) {
const lastTwo = chain.slice(-2);
if (lastTwo.join(',') === rule.pattern.join(',')) {
return this.data.gender === 0 ? rule.male : rule.female;
}
}
// 默认返回末节点关系
return chain[chain.length-1];
}
});
```
### 四、实现原理说明
1. **复合关系映射**:通过`complexRelations`对象定义快捷关系与基础关系的映射,例如"姑"对应`父→姐`的路径组合[^1]
2. **路径解析增强**:
```javascript
resolveComplexPath()方法将快捷关系转换为原子关系链
```
3. **性别敏感处理**:
```javascript
在getFinalTitle()中根据性别视角返回对应称谓,如:
- 男性视角:父+姐 → 姑母
- 女性视角:父+姐 → 姑父
```
4. **代数计算规则**:
```javascript
旁系关系generation设为0,保持代际层级不变
直系关系通过±1累计代数
```
5. **类型判断逻辑**:
```javascript
优先判断姻亲关系,其次旁系关系,最后默认直系
```
### 五、测试用例示例
1. **输入路径**:`['姑'] → 解析为['父','姐']`
2. **男性视角**:`姑母(旁系/0代)`
3. **女性视角**:`姑父(旁系/0代)`
4. **复合路径**:`['父','姐','子'] → 表兄弟(旁系/+1代)`
**注意事项**:
1. 需要补充完整的200+称谓规则库
2. 建议添加路径合法性校验(如:父→父 的非法组合)
3. 可通过`wx.setStorageSync`实现计算历史存储[^2]