From 9464c72f7a16154a9cdf1bc95588e07adc4a0870 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Thu, 12 Mar 2026 21:51:44 +1100 Subject: [PATCH] nmcli: use Map-based lookups for network deduplication MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace O(n²) nested .filter()/.find() loops with Map-keyed lookups for both removal and update passes in getNetworks(). --- services/Nmcli.qml | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/services/Nmcli.qml b/services/Nmcli.qml index 36bd3e6d..812387f1 100644 --- a/services/Nmcli.qml +++ b/services/Nmcli.qml @@ -751,17 +751,25 @@ Singleton { const networks = deduplicateNetworks(allNetworks); const rNetworks = root.networks; - const destroyed = rNetworks.filter(rn => !networks.find(n => n.frequency === rn.frequency && n.ssid === rn.ssid && n.bssid === rn.bssid)); - for (const network of destroyed) { - const index = rNetworks.indexOf(network); - if (index >= 0) { - rNetworks.splice(index, 1); - network.destroy(); + const newMap = new Map(); + for (const n of networks) + newMap.set(`${n.frequency}:${n.ssid}:${n.bssid}`, n); + + for (let i = rNetworks.length - 1; i >= 0; i--) { + const rn = rNetworks[i]; + const key = `${rn.frequency}:${rn.ssid}:${rn.bssid}`; + if (!newMap.has(key)) { + rNetworks.splice(i, 1); + rn.destroy(); } } - for (const network of networks) { - const match = rNetworks.find(n => n.frequency === network.frequency && n.ssid === network.ssid && n.bssid === network.bssid); + const existingMap = new Map(); + for (const rn of rNetworks) + existingMap.set(`${rn.frequency}:${rn.ssid}:${rn.bssid}`, rn); + + for (const [key, network] of newMap) { + const match = existingMap.get(key); if (match) { match.lastIpcObject = network; } else {