From d51e8d3f0de8339f1a8bd08030fa1f3a0b2f80e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?No=C3=A9=20Viricel?= Date: Fri, 4 Dec 2020 22:27:32 +0100 Subject: [PATCH] Ensure that parser.js returns only the needed fields. --- src/utils/parser.js | 46 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/src/utils/parser.js b/src/utils/parser.js index 4bfb289..93777a2 100644 --- a/src/utils/parser.js +++ b/src/utils/parser.js @@ -1,5 +1,8 @@ +// TODO: Create a class from that file. export default (data, keyToFind) => { - const result = []; + let result = []; + + // Keep only levels with { isFruit: true }. JSON.stringify(data, (_, nestedValue) => { if (nestedValue && nestedValue[keyToFind]) { result.push(nestedValue); @@ -7,9 +10,50 @@ export default (data, keyToFind) => { return nestedValue; }); + // Check for a Fruit structure. + result = result.filter(fruit => { + return fruit_structure(fruit, [ + "color", + "description", + "expires", + "id", + "image", + "isFruit", + "name", + "price", + "taste" + ]); + }); + + // Sort fruits by id. result.sort((a, b) => { return a.id - b.id; }); return result; }; + +/** + * Check for a Fruit structure. + * + * @param {Object} obj + * @param {Array} attrs + */ +function fruit_structure(obj, attrs) { + // Check if a field is missing. + for (let i = 0; i < attrs.length; ++i) { + if (!Object.prototype.hasOwnProperty.call(obj, attrs[i])) return false; + } + + // Check for additional fields. + Object.fromEntries( + // eslint-disable-next-line no-unused-vars + Object.entries(obj).filter(([key, value]) => { + // It mutates the initial object by reference. + if (key === "does") delete obj[key]; + return attrs.includes(key); + }) + ); + + return true; +}