Validere duplikater i en liste

Dersom du har en liste over verdier i en funksjon, og du bare ønsker en enkelt av hver verdi, kan du bruke dette eksempelet til å validere dette.

Scripet er som følger:

var liste=Funksjon; //dette er din liste over verdier kan være datakilde, webservice eller funksjon
var duplikat=false; //dette er flagget vi reiser dersom det finnes et duplikat

for(var i=0, i<sizeof(liste), i++){                  //begynner å telle på 0
	for(var ix=i+1,ix<sizeof(liste), ix++){          //setter ix til å være ett nummer større enn i - slik at den ikke validerer seg selv.
		if(liste[i]==liste[ix]){duplikat=true};    
	};
};

return duplikat;

Her looper jeg listen. For hver verdi i listen, looper jeg de neste verdiene i samme liste. Hvis noen av de etterfølgende verdiene matcher, setter jeg flagget “duplikat=true”. Hvis det ikke er match, forblir den false. Jeg vet altså ikke hvor mange matcher jeg får.

Her er tabellen for gjennomgang av en liste med epostadresser. i er den første for-loopen, mens ix er den indre for-loopen. Her har jeg logget epost[i] og epost[ix] for hver loop. For enkelthets skyld har jeg i listen brukt min egen epost med et løpenummer for å gjøre epostene unike. Da blir resultatet slik:

epost i nr0 helge@acos.no0		første for-løkke verdi 0
epost ix nr1 helge@acos.no1			indre for-løkke verdi 1
epost ix nr2 helge@acos.no2			indre for-løkke verdi 2
epost ix nr4 helge@acos.no4			indre for-løkke verdi 3
epost ix nr3 helge@acos.no3			indre for-løkke verdi 4
epost ix nr5 helge@acos.no5			indre for-løkke verdi 5
epost ix nr6 helge@acos.no6			indre for-løkke verdi 6
epost i nr1 helge@acos.no1		første for-løkke verdi 1
epost ix nr2 helge@acos.no2			indre for-løkke verdi 2
epost ix nr3 helge@acos.no3			indre for-løkke verdi 3
epost ix nr4 helge@acos.no4			indre for-løkke verdi 4
epost ix nr5 helge@acos.no5			indre for-løkke verdi 5
epost ix nr6 helge@acos.no6			indre for-løkke verdi 6
epost i nr2 helge@acos.no2		første for-løkke verdi 2
epost ix nr3 helge@acos.no3			indre for-løkke verdi 3
epost ix nr4 helge@acos.no4			indre for-løkke verdi 4
epost ix nr5 helge@acos.no5			indre for-løkke verdi 5
epost ix nr6 helge@acos.no6			indre for-løkke verdi 6
epost i nr3 helge@acos.no3		første for-løkke verdi 3
epost ix nr4 helge@acos.no4			indre for-løkke verdi 4
epost ix nr5 helge@acos.no5			indre for-løkke verdi 5
epost ix nr6 helge@acos.no6			indre for-løkke verdi 6
epost i nr4 helge@acos.no4		første for-løkke verdi 4
epost ix nr5 helge@acos.no5			indre for-løkke verdi 5
epost ix nr6 helge@acos.no6			indre for-løkke verdi 6
epost i nr5 helge@acos.no5		første for-løkke verdi 5
epost ix nr6 helge@acos.no6			indre for-løkke verdi 6
epost i nr6 helge@acos.no6		første for-løkke verdi 6

Dette scriptet er universelt, så det kan brukes med alle mulige verdier. Slik det er satt opp nå fungerer den bare med 1-dimensjonelle arrays, men kan nok sikkert brukes for fler-dimensjonelle hvis man klarer å indeksere dem riktig.

Håper dette kan være nyttig for deg også :slight_smile:

2 Likes

Jeg er ikke så erfaren med datakildebruk, men jeg prøver meg.

Jeg har fått til å liste ut verksemder som hører til et kommunalområde, men jeg skulle gjerne blitt kvitt duplikater. Jeg har prøvd å gjøre noe med scriptet over, men jeg vet ikke helt hvor/hvordan det skal inn for å fungere. Noen med tips?

Mitt script for å hente verksemder:
var kjelde= datatabeller.Kartlegging;
var Beskrivelse1 = ;
var valgtkategori = Kommunalomrade5[“Kommunalomrade”];
loop (kjelde) {
if (valgtkategori == val[“Kommunalomrade”]) {Beskrivelse1 += val[“Verksemd”]:val};
};

return Beskrivelse1;

Jeg har en datasource som indeholder uddannelser og datoer for hvornår de starter. Jeg skal vise uddannelserne i en liste, men ikke for hver dato.
Datasource kan se sådan ud:

UddannelseNavn Dato
Uddannelse1 01-01-2023
Uddannelse2 01-02-2023
Uddannelse3 01-03-2023
Uddannelse1 01-04-2023
Uddannelse2 01-05-2023
Uddannelse3 01-06-2023
Uddannelse1 01-07-2023
Uddannelse2 01-08-2023
Uddannelse3 01-09-2023

Så jeg bruger denne metode med grab, så får jeg kun en række for hvert UddannelseNavn:

var VisUdannelser = datatabeller.Uddannelser;
var distinctUddannelser = grab(Visuddannelser, “UddannelseNavn”);
return distinctUddannelser;

Takk for svar!

Men vil jeg da få listet ut alle Verksemder, istedenfor å få listet ut kun de Verksemder som hører til et valgt Kommunalområde?

(Hvis de velger kommunalområde “Helse”, så skal de kun få opp verksemdene “Institusjonar” og “Arbeid og aktivitet”, ikke resten.)

Jeg bruger 2 dropdown lister, hvor man først vælger en uddannelse og derefter vælger den dato man vil starte på uddannelsen.

Den første indeholder navne på uddannelser:
var VisUdannelser = datatabeller.Uddannelser;
var distinctUddannelser = grab(Visuddannelser, “UddannelseNavn”);
return distinctUddannelser;

Den anden viser datoerne for den uddannelse som man har valgt i den første dropdown liste:
var DSList = datatabeller.Uddannelser;
var DSDato = ;
loop(DSList) {
if (val[“UddannelseNavn”] == Uddannelse[“UddannelseNavn”]) {
DSDato += val[“Dato”] :val;
};
};
return DSDato;

1 Like

Takk igjen! Jeg har også to nedtrekkslister. På første nedtrekkslisten (kommunalområde), så får jeg opp bare én rekke per kommunalområde selv om det står flere ganger i datakilden/excelfilen:

bilde

Men jeg får ikke til å kun få en av hver når jeg henter ut de verksemdene som hører til det valgte kommunalområdet:

var kjelde= datatabeller.Kartlegging;
var Beskrivelse1 = ;
var valgtkategori = Kommunalomrade5[“Kommunalomrade”];
loop (kjelde) {
if (valgtkategori == val[“Kommunalomrade”]) {Beskrivelse1 += val[“Verksemd”]:val};
};

return Beskrivelse1;

Jeg prøvde å gjøre om til din metode, men jeg fikk likevel opp duplikater på verksemdene.

Det ser korrekt ud, så det burde virke.
Måske du skal prøve at ændre if sætningen for at se om det virker:

if (Kommunalomrade5[“Kommunalomrade”] = val[“Kommunalomrade”])

1 Like

Jeg fikk ikke det til å virke heller. Jeg endte tilslutt opp med dette, og det fungerer (tilsynelatende) :slight_smile:

var kjeldeHaram = datatabeller.Haram;
var kjeldeAlesund = datatabeller.Kartlegging;
var Beskrivelse1 = ;
var valgtkategori = Kommunalomrade8[“Kommunalomrade”];

if (Kommune4._lesund6){
loop (kjeldeAlesund) {
if (valgtkategori == val[“Kommunalomrade”]) {Beskrivelse1 += val[“Verksemd”]};
};
{loop (Beskrivelse1)
{
for(var i=0, i<sizeof(kjeldeAlesund[“Verksemd”]), i++){ //begynner å telle på 0
for(var ix=i+1,ix<sizeof(kjeldeAlesund[“Verksemd”]), ix++){ //setter ix til å være ett nummer større enn i - slik at den ikke validerer seg selv.
if(kjeldeAlesund[“Verksemd”][i] == kjeldeAlesund[“Verksemd”][ix]){Beskrivelse1 += val kjeldeAlesund[“Verksemd”]};
};
};
};
};

return Beskrivelse1;
}
if (Kommune4.Haram6){
loop (kjeldeHaram) {
if (valgtkategori == val[“Kommunalomrade”]) {Beskrivelse1 += val[“Verksemd”]};
};
{loop (Beskrivelse1)
{
for(var i=0, i<sizeof(kjeldeHaram[“Verksemd”]), i++){ //begynner å telle på 0
for(var ix=i+1,ix<sizeof(kjeldeHaram[“Verksemd”]), ix++){ //setter ix til å være ett nummer større enn i - slik at den ikke validerer seg selv.
if(kjeldeHaram[“Verksemd”][i] == kjeldeHaram[“Verksemd”][ix]){Beskrivelse1 += val kjeldeHaram[“Verksemd”]};
};
};
};
};

return Beskrivelse1;

Kan det muligvis være fordi der mangler ; efter :val , så if linjen skal se sådan ud:

if (valgtkategori == val[“Kommunalomrade”]) {Beskrivelse1 += val[“Verksemd”]:val;};