From 62bc54b0d3a8a5bb9febf6607afca0865ca9ca35 Mon Sep 17 00:00:00 2001 From: Vladislav Tasev Date: Mon, 18 Apr 2022 16:23:56 +0300 Subject: [PATCH 1/3] refactor: optomize remove duplicated properties --- src/index.js | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/src/index.js b/src/index.js index fefa98c0..9460e854 100644 --- a/src/index.js +++ b/src/index.js @@ -40,14 +40,32 @@ function sortGroups(selector) { * @param {Boolean} exact */ function removeDupProperties(selector, exact) { - // Remove duplicated properties from bottom to top () - for (let actIndex = selector.nodes.length - 1; actIndex >= 1; actIndex--) { - for (let befIndex = actIndex - 1; befIndex >= 0; befIndex--) { - if (selector.nodes[actIndex].prop === selector.nodes[befIndex].prop) { + if (!exact) { // Remove duplicated properties, regardless of value + const lastIndices = new Map(); // stores the last index at which each prop is found + const indicesToRemove = []; // list of indices to remove in descending order + + for (let actIndex = selector.nodes.length - 1; actIndex >= 1; actIndex--) { + const prop = selector.nodes[actIndex].prop; + if (prop !== undefined) { + if (!lastIndices.has(prop)) { + lastIndices.set(prop, actIndex); // Store the last occurrence of the prop - it will be kept + } else { + indicesToRemove.push(actIndex); // This occurrence of the prop must be removed + } + } + } + + // Indeces to be removed are already sorted from biggest to last + indicesToRemove.forEach(indexToRemove => { + selector.nodes[indexToRemove].remove(); + }); + } else { + // Remove duplicated properties from bottom to top () + for (let actIndex = selector.nodes.length - 1; actIndex >= 1; actIndex--) { + for (let befIndex = actIndex - 1; befIndex >= 0; befIndex--) { if ( - !exact || - (exact && - selector.nodes[actIndex].value === selector.nodes[befIndex].value) + selector.nodes[actIndex].prop === selector.nodes[befIndex].prop && + selector.nodes[actIndex].value === selector.nodes[befIndex].value ) { selector.nodes[befIndex].remove(); actIndex--; From 585b678339bd5bb1ea43d348775007ce2eec7f89 Mon Sep 17 00:00:00 2001 From: Vladislav Tasev Date: Mon, 18 Apr 2022 16:37:34 +0300 Subject: [PATCH 2/3] refactor: simplify --- src/index.js | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/index.js b/src/index.js index 9460e854..d89880fb 100644 --- a/src/index.js +++ b/src/index.js @@ -41,24 +41,18 @@ function sortGroups(selector) { */ function removeDupProperties(selector, exact) { if (!exact) { // Remove duplicated properties, regardless of value - const lastIndices = new Map(); // stores the last index at which each prop is found - const indicesToRemove = []; // list of indices to remove in descending order + const retainedProps = new Set(); for (let actIndex = selector.nodes.length - 1; actIndex >= 1; actIndex--) { const prop = selector.nodes[actIndex].prop; if (prop !== undefined) { - if (!lastIndices.has(prop)) { - lastIndices.set(prop, actIndex); // Store the last occurrence of the prop - it will be kept + if (!retainedProps.has(prop)) { + retainedProps.add(prop); // Mark the prop as retained, all other occurrences must be removed } else { - indicesToRemove.push(actIndex); // This occurrence of the prop must be removed + selector.nodes[actIndex].remove(); // This occurrence of the prop must be removed } } } - - // Indeces to be removed are already sorted from biggest to last - indicesToRemove.forEach(indexToRemove => { - selector.nodes[indexToRemove].remove(); - }); } else { // Remove duplicated properties from bottom to top () for (let actIndex = selector.nodes.length - 1; actIndex >= 1; actIndex--) { From 048182ab5f68b05c2772e31601293e98b95b1377 Mon Sep 17 00:00:00 2001 From: Vladislav Tasev Date: Mon, 18 Apr 2022 17:38:18 +0300 Subject: [PATCH 3/3] refactor: lint --- src/index.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/index.js b/src/index.js index d89880fb..65a2a49c 100644 --- a/src/index.js +++ b/src/index.js @@ -47,9 +47,11 @@ function removeDupProperties(selector, exact) { const prop = selector.nodes[actIndex].prop; if (prop !== undefined) { if (!retainedProps.has(prop)) { - retainedProps.add(prop); // Mark the prop as retained, all other occurrences must be removed + // Mark the prop as retained, all other occurrences must be removed + retainedProps.add(prop); } else { - selector.nodes[actIndex].remove(); // This occurrence of the prop must be removed + // This occurrence of the prop must be removed + selector.nodes[actIndex].remove(); } } }