diff --git a/src/jsonata.js b/src/jsonata.js index d6198905..19b09409 100644 --- a/src/jsonata.js +++ b/src/jsonata.js @@ -922,7 +922,7 @@ var jsonata = (function() { var pair = expr.lhs[pairIndex]; var key = yield * evaluate(pair[0], reduce ? item['@'] : item, env); // key has to be a string - if (typeof key !== 'string') { + if (typeof key !== 'string' && key !== undefined) { throw { code: "T1003", stack: (new Error()).stack, @@ -930,24 +930,27 @@ var jsonata = (function() { value: key }; } - var entry = {data: item, exprIndex: pairIndex}; - if (groups.hasOwnProperty(key)) { - // a value already exists in this slot - if(groups[key].exprIndex !== pairIndex) { - // this key has been generated by another expression in this group - // when multiple key expressions evaluate to the same key, then error D1009 must be thrown - throw { - code: "D1009", - stack: (new Error()).stack, - position: expr.position, - value: key - }; - } - // append it as an array - groups[key].data = fn.append(groups[key].data, item); - } else { - groups[key] = entry; + if (key !== undefined) { + var entry = {data: item, exprIndex: pairIndex}; + if (groups.hasOwnProperty(key)) { + // a value already exists in this slot + if(groups[key].exprIndex !== pairIndex) { + // this key has been generated by another expression in this group + // when multiple key expressions evaluate to the same key, then error D1009 must be thrown + throw { + code: "D1009", + stack: (new Error()).stack, + position: expr.position, + value: key + }; + } + + // append it as an array + groups[key].data = fn.append(groups[key].data, item); + } else { + groups[key] = entry; + } } } } diff --git a/test/test-suite/groups/object-constructor/case026.json b/test/test-suite/groups/object-constructor/case026.json new file mode 100644 index 00000000..b08f49aa --- /dev/null +++ b/test/test-suite/groups/object-constructor/case026.json @@ -0,0 +1,6 @@ +{ + "expr": "$${id:{'label':label,'value':value}}", + "data": [], + "bindings": {}, + "result": {} +}