From 771fdcc67ce4f8153503c41b0b31acb4e3005f45 Mon Sep 17 00:00:00 2001 From: FrancoisGe Date: Mon, 22 Aug 2022 14:18:07 +0000 Subject: [PATCH] [FIX] web: pick a non-enumerable property Before this commit, pick did not work on non-enumerable properties. For example, getters in a class are non-enumerable properties. It was not possible to pick the value of a getter in a Class with the pick function. closes odoo/odoo#97558 Signed-off-by: Aaron Bohy (aab) --- addons/web/static/src/core/utils/objects.js | 4 +++- addons/web/static/tests/core/utils/objects_tests.js | 10 ++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/addons/web/static/src/core/utils/objects.js b/addons/web/static/src/core/utils/objects.js index 82850ff44ee..e58acf12590 100644 --- a/addons/web/static/src/core/utils/objects.js +++ b/addons/web/static/src/core/utils/objects.js @@ -29,5 +29,7 @@ export function deepCopy(obj) { * @returns {Partial} */ export function pick(object, ...properties) { - return Object.fromEntries(Object.entries(object).filter(([k]) => properties.includes(k))); + return Object.fromEntries( + properties.filter((prop) => prop in object).map((prop) => [prop, object[prop]]) + ); } diff --git a/addons/web/static/tests/core/utils/objects_tests.js b/addons/web/static/tests/core/utils/objects_tests.js index 70891dab0d9..5ead0b40bb6 100644 --- a/addons/web/static/tests/core/utils/objects_tests.js +++ b/addons/web/static/tests/core/utils/objects_tests.js @@ -11,6 +11,16 @@ QUnit.module("utils", () => { assert.deepEqual(pick({ a: 3, b: "a", c: [] }, "a"), { a: 3 }); assert.deepEqual(pick({ a: 3, b: "a", c: [] }, "a", "c"), { a: 3, c: [] }); assert.deepEqual(pick({ a: 3, b: "a", c: [] }, "a", "b", "c"), { a: 3, b: "a", c: [] }); + + // Non enumerable property + class MyClass { + get a() { + return 1; + } + } + const myClass = new MyClass(); + Object.defineProperty(myClass, "b", { enumerable: false, value: 2 }); + assert.deepEqual(pick(myClass, "a", "b"), { a: 1, b: 2 }); }); QUnit.test("shallowEqual: simple valid cases", function (assert) {