NEWS
Vergleich von Objekten in Arrays
-
Hi,
ich möchte die Werte der jeweiligen Keys vergleichen. In dem Fall die Werte von Lights.
Ziel ist, gleiche Werte zu identifizieren.
Ich möchte verhindern, dass z.B. [1] in mehren Keys vorkommt.
Wie ist die beste vorgehensweise?arr = [ { lights: [1,2] }, { lights: [3,4] }, { lights: [1,5] } ];
-
@schmakus da kommst du um eine schleife nicht drum herum..
bzw was willst du dann machen ?? ewtl wandel das array nach string und mit replace den wert löschen
-
@schmakus
Wo ist in diesem Array oder den Objekten dein eindeutiger Schlüssel? -
Entscheidend ist die Frage was du tun willst wenn doch eine Zahl an mehreren Stellen vorkommt.
let present = '|'; for (const obj of arr) { for (const id of arr.lights { if (present.indexOf(`|${id}|`) > -1) { //duplikat gefunden } else { present = present.concat(`${id}|`); } } }
-
@asgothian
Ich möchte eine Ausgabe im Log, wenn eine Zahl mehrmals vorkommt.
Werde deinen Code gleich mal testen!Habe zwischenzeitlich dieses aufwändige Teil zusammengebastelt.
function find_duplicate_in_array(arrOne) { //Alle Werte aus allen Lights mappen const arr = arrOne.map(a => a.lights); //Flaches Array erstellen const array = arr.flat() const object = {}; const result = []; array.forEach(item => { if(!object[item]) object[item] = 0; object[item] += 1; }) for (const prop in object) { if(object[prop] >= 2) { result.push(prop); } } return result; } //Funktion ausführen let dups = find_duplicate_in_array(arrOne); //Inhalt zählen let count = dups.length; if (count > 0) { if (count > 1) { dups = dups.join(' und '); console.warn(`Lampen ${dups} kommen mehrmals vor!`); } else { console.warn(`Lampe ${dups} kommt mehrmals vor!`); } } else { console.log(`Keine Lampen kommen mehrmals vor. Gut!`); }
-
@schmakus sagte in Vergleich von Objekten in Arrays:
arr = [ { lights: [1,2] }, { lights: [3,4] }, { lights: [1,5] } ];
Die beste Vorgehensweise ist, bereits vor dem hinzufügen zu prüfen, ob der wert (nicht key) bereits vorhanden ist.
arr.reduce((acc,el)=>el.lights.includes(1)) // ergibt true arr.reduce((acc,el)=>el.lights.includes(6)) // ergibt false
-
@arteck Ein Replace nicht. Ich möchte nur verhindern, bzw. eine Ausgabe loggen, wenn eine Lampe in mehreren Gruppen zugeordnet wurde.
-
@oliverio Die Werte werden aktuell noch manuell eingetragen, bzw. die Objekte manuell erstellt. Deshalb die Abfrage beim Starten eines Scripts.
-
@schmakus sagte in Vergleich von Objekten in Arrays:
@oliverio Die Werte werden aktuell noch manuell eingetragen, bzw. die Objekte manuell erstellt. Deshalb die Abfrage beim Starten eines Scripts.
ok, falls schon duplikate drin sind dann so
var data=[];arr.map(i1=>i1.lights.map(i2=>isNaN(data[i2])?data[i2]=1:data[i2]++))
data enthält dann eine Auflistung, welcher wert wie oft enthalten ist.
"[null,2,1,1,1,1]"
das bedeutet:
key 0 exisitiert gar nicht, daher null
key 1 exisitiert 2 mal
key 2 exisitiert 1 mal
key 3 exisitiert 1 mal
key 4 exisitiert 1 mal
key 5 exisitiert 1 mal
key 6 exisitiert 1 mal -
@schmakus sagte in Vergleich von Objekten in Arrays:
Ausgabe loggen, wenn eine Lampe in mehreren Gruppen zugeordnet wurde.
Vorschlag:
function findDuplicate(arr) { let found = []; for(let i = 0; i < arr.length; i++) { let lights = arr[i].lights; for(let j = 0; j < lights.length; j++) { if(found.includes(lights[j])) log('Lampe ' + lights[j] + ' kommt mehrmals vor!', 'warn'); else found.push(lights[j]); } } }
-
@paul53 sagte in Vergleich von Objekten in Arrays:
@schmakus sagte in Vergleich von Objekten in Arrays:
Ausgabe loggen, wenn eine Lampe in mehreren Gruppen zugeordnet wurde.
Vorschlag:
function findDuplicate(arr) { let found = []; for(let i = 0; i < arr.length; i++) { let lights = arr[i].lights; for(let j = 0; j < lights.length; j++) { if(found.includes(lights[j])) log('Lampe ' + lights[j] + ' kommt mehrmals vor!', 'warn'); else found.push(lights[j]); } } }
das folgende meldet, sobald eine lampe das 2. mal oder noch öfters vorkommt, jedes mit einer einzelnen meldung
var data=[];arr.map(i1=>i1.lights.map(i2=>{isNaN(data[i2])?data[i2]=1:data[i2]++;data[i2]>1?console.log("found duplicate "+i2):""}))
das hier gibt Meldungen aus, wenn alles eingesammelt wurde
var data=[]; arr.map(i1=>i1.lights.map(i2=>{isNaN(data[i2])?data[i2]=1:data[i2]++})); data.map((el,i)=>el>1?console.log("Lampe "+i+" kommt "+el+" vor"):"")
-