diff --git a/addons/web/static/src/core/utils/arrays.js b/addons/web/static/src/core/utils/arrays.js index bd028a45c27..d5ed7a62171 100644 --- a/addons/web/static/src/core/utils/arrays.js +++ b/addons/web/static/src/core/utils/arrays.js @@ -53,6 +53,14 @@ function _getExtractorFrom(criterion) { } } +/** + * @template T + * @param {T | T[]} value + */ +export function ensureArray(value) { + return value && typeof value === "object" && value[Symbol.iterator] ? [...value] : [value]; +} + /** * Returns the array of elements contained in both arrays. * diff --git a/addons/web/static/tests/core/utils/arrays_tests.js b/addons/web/static/tests/core/utils/arrays_tests.js index 9626a84af32..2ed36279de2 100644 --- a/addons/web/static/tests/core/utils/arrays_tests.js +++ b/addons/web/static/tests/core/utils/arrays_tests.js @@ -2,6 +2,7 @@ import { cartesian, + ensureArray, groupBy, intersection, shallowEqual, @@ -238,6 +239,18 @@ QUnit.module("utils", () => { assert.deepEqual(cartesian([1], [2], [3], [4]), [[1, 2, 3, 4]]); }); + QUnit.test("ensure array", async (assert) => { + const arrayRef = []; + assert.notEqual(ensureArray(arrayRef), arrayRef, "Should be a different array"); + assert.deepEqual(ensureArray([]), []); + assert.deepEqual(ensureArray(), [undefined]); + assert.deepEqual(ensureArray(null), [null]); + assert.deepEqual(ensureArray({ a: 1 }), [{ a: 1 }]); + assert.deepEqual(ensureArray("foo"), ["foo"]); + assert.deepEqual(ensureArray([1, 2, "3"]), [1, 2, "3"]); + assert.deepEqual(ensureArray(new Set([1, 2, 3])), [1, 2, 3]); + }); + QUnit.test("unique array", function (assert) { assert.deepEqual(unique([1, 2, 3, 2, 4, 3, 1, 4]), [1, 2, 3, 4]); assert.deepEqual(unique("a d c a b c d b".split(" ")), "a d c b".split(" "));