'use client'; import { calculateBigFiveResults, calculateIpipNeoResults, ipipNeoItemsByVersion, } from '../../test/private/BigFiveCalculator'; import { ipipNeoFacets } from '@/questionairies/bigfive/neo-data'; interface BigFiveResultProps { answers: string[]; version?: 50 | 120 | 300; } interface ScoreResult { score: number; average: number; itemCount?: number; } const domainLabels = { neuroticism: { name: '神经质', desc: '情绪敏感、压力反应以及体验焦虑、烦躁等负面情绪的倾向。', }, extraversion: { name: '外向性', desc: '社交投入、自信表达、活跃度和积极情绪。', }, openness: { name: '开放性', desc: '想象力、审美、求知、尝新和价值观开放程度。', }, agreeableness: { name: '宜人性', desc: '信任、真诚、合作、利他、谦逊和同情倾向。', }, conscientiousness: { name: '尽责性', desc: '自我效能、条理、责任、自律、成就追求和谨慎。', }, }; const shortLabels = { extraversion: domainLabels.extraversion, agreeableness: domainLabels.agreeableness, conscientiousness: domainLabels.conscientiousness, emotionalStability: { name: '情绪稳定性', desc: '情绪平稳、压力耐受和较少焦虑烦躁。', }, openness: domainLabels.openness, }; function level(average: number) { if (average >= 3.8) return '较高'; if (average <= 2.4) return '较低'; return '中等'; } function barWidth(average: number) { return `${Math.max(0, Math.min(100, ((average - 1) / 4) * 100))}%`; } function ScoreCard({ name, desc, result, maxScore, }: { name: string; desc: string; result: ScoreResult; maxScore: number; }) { return (

{name}

{desc}

{result.score}
/ {maxScore}
倾向:{level(result.average)} 平均 {result.average.toFixed(2)} / 5
); } export function BigFiveResult({ answers, version = 50 }: BigFiveResultProps) { if (version === 50) { const results = calculateBigFiveResults(answers); return (

五大人格结果

每个维度满分50分。分数表示相对倾向,没有绝对好坏。

{Object.entries(shortLabels).map(([key, info]) => ( ))}
); } const items = ipipNeoItemsByVersion[version]; const results = calculateIpipNeoResults(answers, [...items]); const domainItemCount = version === 120 ? 24 : 60; const facetItemCount = version === 120 ? 4 : 10; return (

IPIP-NEO {version}题结果

先看五大维度了解整体轮廓,再查看30个面向理解具体差异。分数代表相对倾向,没有绝对好坏。

五大维度

{Object.entries(domainLabels).map(([key, info]) => ( ))}

30个细分面向

{Object.entries(ipipNeoFacets).map(([key, facet]) => { const result = results.facets[key] as ScoreResult; return (

{facet.name}

{result.score} / {facetItemCount * 5}
{level(result.average)} · 平均 {result.average.toFixed(2)} / 5
); })}
建议结合维度和面向一起阅读:同一大维度下的六个面向可能高低不同,这通常比单一总分更能描述个人风格。
); }