diff --git a/client/web/divkit/src/expressions/utils.ts b/client/web/divkit/src/expressions/utils.ts index eea5d28f1..6fc5c2214 100644 --- a/client/web/divkit/src/expressions/utils.ts +++ b/client/web/divkit/src/expressions/utils.ts @@ -36,6 +36,19 @@ export function dateToString(date: Date): string { ].join(':'); } +function stringifySortReplacer(key: string, value: unknown): unknown { + if (value && value instanceof Object && !Array.isArray(value)) { + return Object.keys(value) + .sort() + .reduce>((sorted, key) => { + sorted[key] = value[key as keyof typeof value]; + return sorted; + }, {}); + } + + return value; +} + export function valToString(val: EvalValue, stringifyComplex: boolean): string { if (val.type === 'string') { return val.value; @@ -64,7 +77,7 @@ export function valToString(val: EvalValue, stringifyComplex: boolean): string { } else if (val.type === 'url') { return val.value; } else if ((val.type === 'dict' || val.type === 'array') && stringifyComplex) { - return JSON.stringify(val.value); + return JSON.stringify(val.value, stringifySortReplacer); } else if (val.type === 'dict') { return ''; } else if (val.type === 'array') { diff --git a/test_data/expression_test_data/functions_to_string.json b/test_data/expression_test_data/functions_to_string.json index f4d5f483d..fdc37484e 100644 --- a/test_data/expression_test_data/functions_to_string.json +++ b/test_data/expression_test_data/functions_to_string.json @@ -289,7 +289,8 @@ } ], "platforms": [ - "ios" + "ios", + "web" ] }, { diff --git a/test_data/expression_test_data/variables_values.json b/test_data/expression_test_data/variables_values.json index e85c27cb0..a10498902 100644 --- a/test_data/expression_test_data/variables_values.json +++ b/test_data/expression_test_data/variables_values.json @@ -183,7 +183,8 @@ } ], "platforms": [ - "ios" + "ios", + "web" ] }, {