diff --git a/src/engine.js b/src/engine.js index 1796341..0b7b973 100644 --- a/src/engine.js +++ b/src/engine.js @@ -21,7 +21,7 @@ class Engine { keywords = Engine.participle(item, dict, prefix); } else { for (const key of indexs) { - const words = item[key]; + const words = resolve(key, item); if (words) { keywords += Engine.participle(words, dict, prefix); } @@ -110,4 +110,9 @@ class Engine { } }; -module.exports = Engine; \ No newline at end of file +function resolve(path, obj, separator='.') { + let properties = Array.isArray(path) ? path : path.split(separator) + return properties.reduce((prev, curr) => prev && prev[curr], obj) +} + +module.exports = Engine; diff --git a/test/index.test.js b/test/index.test.js index 18c825a..b600dcf 100644 --- a/test/index.test.js +++ b/test/index.test.js @@ -14,7 +14,8 @@ describe('PinyinEngine()', () => { assert.deepEqual(['中央美院'], pinyinEngine.query('meiyuan')); }); it('数据应当支持 `[Object]`', () => { - const pinyinEngine = new PinyinEngine([{ + const pinyinEngine = new PinyinEngine([ + { id: 0, name: '清华大学' }, @@ -32,6 +33,33 @@ describe('PinyinEngine()', () => { name: '中央美院' }], pinyinEngine.query('meiyuan')); }); + it('索引取值应当支持 path 格式', () => { + const pinyinEngine = new PinyinEngine([{ + id: 0, + deep: { + name: '清华大学' + } + }, + { + id: 1, + deep: { + name: '北京大学' + } + }, + { + id: 3, + deep: { + name: '中央美院' + } + } + ], ['deep.name']); + assert.deepEqual([{ + id: 3, + deep: { + name: '中央美院' + } + }], pinyinEngine.query('meiyuan')); + }); it('应当支持拼音首字母', () => { const pinyinEngine = new PinyinEngine([ '清华大学', @@ -74,4 +102,4 @@ describe('PinyinEngine()', () => { }); }); -}); \ No newline at end of file +});