diff --git a/src/interpreter.ts b/src/interpreter.ts index d0598f8..23035fa 100644 --- a/src/interpreter.ts +++ b/src/interpreter.ts @@ -10,7 +10,8 @@ import { getType, isDuration, isDateTime, - isType + isType, + isNumber } from './types'; import { @@ -704,6 +705,20 @@ function evalNode(node: SyntaxNodeRef, input: string, args: any[]) { return null; } + // a[variable=number] + if (typeof filterFn.type === 'undefined') { + try { + const value = filterFn(context); + + if (isNumber(value)) { + filterFn.type = 'number'; + } + } catch (err) { + + // ignore + } + } + // a[1] if (filterFn.type === 'number') { const idx = filterFn(context); diff --git a/test/interpreter-spec.js b/test/interpreter-spec.js index 78b2686..7662496 100644 --- a/test/interpreter-spec.js +++ b/test/interpreter-spec.js @@ -681,7 +681,20 @@ describe('interpreter', function() { expr('a[1]', null); - expr('[][a]', [], { a: 1 }); + expr('[][a]', null, { a: 1 }); + + expr('[][a]', [], { a: '1' }); + + expr('["A", "B", "C"][i]', 'A', { i: 1 }); + expr('["A", "B", "C"][i]', 'C', { i: -1 }); + + expr('["A", "B", "C"][a + b]', 'B', { a: 1, b: 1 }); + expr('["A", "B", "C"][a - b]', 'B', { a: 3, b: 1 }); + + expr('["A", "B", "C"][a()]', 'B', { + a() { return 2; } + }); + });