You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
In all the example given in the spec page for the merge() functionLITERAL types are provided as arguments to the function. While this demonstrates the behaviour it is not at all useful in practical terms. Literals can only be explicitly defined by the editor of an expression. Much more useful would be to merge on results of expressions or on projections.
In order to do this merge would have to accept either TYPE_OBJECT or TYPE_ARRAY to work and the function would need to be able to switch on either type to handle this.
Discussion
Array can contain any value and ideally we may want to restrict it to a new TYPE_ARRAY_OBJECT type so that we can guarantee only objects can be used in the merge. One interesting side effect of this in javascript is that merging arrays results in array members being keyed in their index. This means we can do the following with very little code change:
search([{"A": "ONE"},"TWO",{"C": "THREE"}],'merge(@)')// OUTPUTS: {"0": "ZERO", "A": "ONE", "C": "THREE"}// With all JSON array member types:search([{"A": "ONE"},true,null,"BAR",["ZERO"],666],'merge(@)')// OUTPUTS: {"0": "ZERO", "1": "A", "2": "R", "A": "ONE"}
Implementation in jmespath.ts
// Runtimeprivate functionMerge: RuntimeFunction<JSONObject[],JSONObject>=resolvedArgs=>{letmerged={};for(leti=0;i<resolvedArgs.length;i+=1){constcurrent=resolvedArgs[i];if(Array.isArray(current)){merged=Object.assign(merged, ...current);}else{merged=Object.assign(merged,current);}}returnmerged;};// and in the function tablemerge: {_func: this.functionMerge,_signature: [{types: [InputArgument.TYPE_OBJECT,InputArgument.TYPE_ARRAY],variadic: true,},],},
The text was updated successfully, but these errors were encountered:
I totally 👍 to motivation section and examples in "examples" section. It seems for now [{"a": "b"}, {"c": "d"}] input can't be flatten with either merge(@) or [].
However, the first example in "discussion" section looks buggy, and the second is quite counter-intuitive.
I still like this proposal. I certainly expected that I could pass a list of dictionaries to merge and was surprised that it did not work as I expected.
Background
In all the example given in the spec page for the merge() function
LITERAL
types are provided as arguments to the function. While this demonstrates the behaviour it is not at all useful in practical terms. Literals can only be explicitly defined by the editor of an expression. Much more useful would be to merge on results of expressions or on projections.Examples:
In order to do this merge would have to accept either TYPE_OBJECT or TYPE_ARRAY to work and the function would need to be able to switch on either type to handle this.
Discussion
Array can contain any value and ideally we may want to restrict it to a new
TYPE_ARRAY_OBJECT
type so that we can guarantee only objects can be used in the merge. One interesting side effect of this in javascript is that merging arrays results in array members being keyed in their index. This means we can do the following with very little code change:Implementation in jmespath.ts
The text was updated successfully, but these errors were encountered: