feat: 拼音子序列匹配+产品名拼音补全+滴数框缩窄
Some checks failed
PR Preview / teardown-preview (pull_request) Has been skipped
Test / unit-test (push) Failing after 5s
Test / e2e-test (push) Has been skipped
Test / build-check (push) Successful in 4s
PR Preview / test (pull_request) Failing after 5s
PR Preview / deploy-preview (pull_request) Has been skipped
Some checks failed
PR Preview / teardown-preview (pull_request) Has been skipped
Test / unit-test (push) Failing after 5s
Test / e2e-test (push) Has been skipped
Test / build-check (push) Successful in 4s
PR Preview / test (pull_request) Failing after 5s
PR Preview / deploy-preview (pull_request) Has been skipped
- 拼音匹配支持子序列(js匹配紧致霜),排序: 前缀>子串>子序列 - 补全产品名拼音(身紧致霜膏膜等) - 滴数输入框从65/70px缩至50px Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -76,6 +76,12 @@ const PINYIN_MAP = {
|
||||
'空': 'k', '风': 'f', '文': 'w', '月': 'y', '云': 'y',
|
||||
'五': 'w', '味': 'w', '愈': 'y', '创': 'c', '慰': 'w',
|
||||
'扁': 'b', '广': 'g', '州': 'z', '热': 'r',
|
||||
// Product name chars
|
||||
'身': 's', '紧': 'j', '致': 'z', '霜': 's', '膏': 'g',
|
||||
'膜': 'm', '乳': 'r', '液': 'y', '瓶': 'p', '盒': 'h',
|
||||
'深': 's', '层': 'c', '肤': 'f', '磨': 'm', '砂': 's',
|
||||
'龄': 'l', '无': 'w', '年': 'n', '华': 'h', '娇': 'j',
|
||||
'颜': 'y', '喷': 'p', '雾': 'w',
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -95,12 +101,42 @@ export function getPinyinInitials(name) {
|
||||
|
||||
/**
|
||||
* Check if a query matches a name by pinyin initials.
|
||||
* The query is matched as a prefix or substring of the pinyin initials.
|
||||
* Supports: prefix match, substring match, and subsequence match.
|
||||
*/
|
||||
export function matchesPinyinInitials(name, query) {
|
||||
if (!query || !name) return false
|
||||
const initials = getPinyinInitials(name)
|
||||
if (!initials) return false
|
||||
const q = query.toLowerCase()
|
||||
return initials.startsWith(q)
|
||||
// Prefix or substring (consecutive)
|
||||
if (initials.includes(q)) return true
|
||||
// Subsequence: each char of q appears in order in initials
|
||||
let pos = 0
|
||||
for (const ch of q) {
|
||||
pos = initials.indexOf(ch, pos)
|
||||
if (pos === -1) return false
|
||||
pos++
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
/**
|
||||
* Score how well a query matches pinyin initials.
|
||||
* 0 = prefix, 1 = substring, 2 = subsequence, -1 = no match
|
||||
*/
|
||||
export function pinyinMatchScore(name, query) {
|
||||
if (!query || !name) return -1
|
||||
const initials = getPinyinInitials(name)
|
||||
if (!initials) return -1
|
||||
const q = query.toLowerCase()
|
||||
if (initials.startsWith(q)) return 0
|
||||
if (initials.includes(q)) return 1
|
||||
// Subsequence check
|
||||
let pos = 0
|
||||
for (const ch of q) {
|
||||
pos = initials.indexOf(ch, pos)
|
||||
if (pos === -1) return -1
|
||||
pos++
|
||||
}
|
||||
return 2
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user