Avatar billede dennish Nybegynder
18. september 2007 - 19:01 Der er 28 kommentarer og
3 løsninger

sammenlgne 2 arrays

Hej
Jeg har følgede kode;
Har 2 arrays postChecked og preChecked.
Jeg vil gerne finde ud af om preChecked er forskellige fra postChecked

postChecked = {1,2,3,6,7}
preCheked = {1,2,3}
giver false fordi preCheced ikke indeholder 6 og 7 ,men

postChecked = {1,2,3,6,7}
preCheked = {1,2,3,6,7,8} giver true fordi preChecked indeholder aller værdier der er i postChecked
 

for(var k=0; k < preChecked.length; k++)
{
  var found = 0; // false   
  for(var j=0; j < postChecked.length; j++)
  {
    if(preChecked[k]==postChecked[j]
    {
      found = 1;// true
      continue;
    }
}   
}

Jeg kan ikke lige greje min kode nogle der kan hjælpe ?
Avatar billede nielle Nybegynder
18. september 2007 - 19:09 #1
Er det to arrays altid sorteret i stigende orden?
Avatar billede nielle Nybegynder
18. september 2007 - 19:13 #2
Hvis de er ... burde det kunne gøres sådan her:

identisk = true;

if (preChecked.length != postChecked.length
{
    identisk = false;
}
else
{
    for (var k = 0; k < preChecked.length; k++)
    {
        if (preChecked[k] != postChecked[k])
        {
            identisk = false;
            break;
        }
    }
}
Avatar billede dennish Nybegynder
18. september 2007 - 19:16 #3
nielle>> nej de er ikke nødvendigvis i stigende rækkefølge. Jeg vil bare gerne gannemløbe alle mine værdier i mit array postChecked og se om disse også er i preCheked, hvis ikke er der en difference og jeg skal så lave en alert box
Avatar billede nielle Nybegynder
18. september 2007 - 19:19 #4
Kan en værdi forekomme mere end en gang i et af dine arrays?
Avatar billede dennish Nybegynder
18. september 2007 - 19:22 #5
nielle, nej alle værdierne er unikke dvs hver array kan ikke indeholde ens værdier
så preChecked = {1,2,3,6,7} er ok men {1,2,3,3,6,7} er ikke ok
dette gælder også for arrayet postChecked
Avatar billede nielle Nybegynder
18. september 2007 - 19:24 #6
Ok et sidste spørgsmål: vil alle værdierne fra preChecked altid være i postChecked?
Avatar billede olebole Juniormester
18. september 2007 - 19:33 #7
<ole>

Jamen, det har jo ikke noget med arrays at gøre  :)

Shorthand-syntaksen for et array er:
    postChecked = [1,2,3,6,7];

Curly braces giver ingen mening, brugt på dén måde  ;o)

/mvh
</bole>
Avatar billede olebole Juniormester
18. september 2007 - 19:33 #8
Hvorfra kommer de to 'arrays'?
Avatar billede nielle Nybegynder
18. september 2007 - 19:36 #9
Muligvis bare en typo?

var identisk = true;

for (var k=0; k<preChecked.length; k++)
{
    var found = false;

    for (var j=0; j<postChecked.length; j++)
    {
        if (preChecked[k] == postChecked[j])
        {
            found = true;
            break;
        }
    }

    if (!found)
        identisk = false;
}
Avatar billede olebole Juniormester
18. september 2007 - 19:44 #10
Du kan også:

function compArrs(aA, aB) {
    var aA2 = aA.concat([]);
    var aB2 = aB.concat([]);
    aA2.sort();
    aB2.sort();
    for (var i=0,j=aA2.length; i<j; i++) if (aA2[i]!=aB2[i]) return false;
    return true
}

var aA = [3,2,5,1,4];
var aB = [2,3,1,4,5];
alert( compArrs(aA, aB) );
Avatar billede olebole Juniormester
18. september 2007 - 19:49 #11
PS: Den lidt pudsige konstruktion:
    var aA2 = aA.concat([]);

- kloner array'et. Skrev jeg i stedet
    var aA2 = aA;
    var aB2 = aB;
    aA2.sort();
    aB2.sort();

Ville jeg oprette referencer til de oprindelige arrays - og derved også sortere dem! Derfor det lille 'hack'  ;o)
Avatar billede dennish Nybegynder
18. september 2007 - 19:50 #12
ok sorry kom til at lave syntaks for arrays i Java og ikke javasript. Min arrays kommer fra en side hvor jeg har en masse chekbokse. Ved load af siden kalder jeg en funktion init der populerer mit array postCheked. Når jeg så efterfølgede har checked diverse chekboxe af trykker jeg på save og kalder onsubmit="return checkCheckBoxes(this)"

function checkCheckBoxes(form) {
    var postCheckedModerators = new Array();   
    for(i = 0; i< form.selectedGroups.length;i++) {
        if(form.selectedGroups[i].postCheckedModerators) {
            postCheckedModerators[postCheckedModerators.length]=form.selectedGroups[i].value;
        }
    }

    for(var k=0; k < preCheckedModerators.length; k++) {
        var found = 0; // false   
        for(var j=0; j < postCheckedModerators.length; j++) {
            if(preCheckedModerators[k]==postCheckedModerators[j]) {
                found = 1;// true
                continue;
            }
        }   
    }
}

og der er så her jeg vil sammenligne de 2 arrays
Avatar billede olebole Juniormester
18. september 2007 - 19:59 #13
Så har jeg et andet og bedre bud. Det er nemlig langt hurtigere at tjekke ned i en hash-tabel. Giv alle dine checkbokse en ID ... f.eks: 'ch0', 'ch1', 'ch2', osv.

På onload fylder du et objekt med de checked elementer - på formen:
    var preChecked = {'ch1':1, 'ch3':1, 'ch4':1};

Så kan du bladre dine elementer igennem på onsubmit:

function tjekChBoxes(form) {
    var aElms = form.elements;
    for (var i=0,j=aElms.length; i<j; i++) if (aElms[i].checked&&!preChecked[ aElms[i].id ]) return false;
    return true;
}
Avatar billede olebole Juniormester
18. september 2007 - 20:01 #14
- og du bør nok udbygge betingelsen lidt:

for (var i=0,j=aElms.length; i<j; i++) if (aElms[i].type=="checkbox"&&aElms[i].checked&&!preChecked[ aElms[i].id ]) return false;
Avatar billede dennish Nybegynder
18. september 2007 - 20:10 #15
ole pga en foruddefineret struktur kan jeg kun give mine checkboxe en value. Men det er vel ligså godt som et id ?

<indput type ="checkbox" name="names" value="1004" checked ="checked" />
<indput type ="checkbox" name="names" value="1003" checked ="checked" />
osv ..
Avatar billede olebole Juniormester
18. september 2007 - 20:11 #16
- men det allerbedste ville vel være at sætte en attribut på hver checkbox. På onload bladrer du alle checkboksene igennem. Hvis den enkelte er checked, sætter du denne attribut:
    CHECKBOX.setAttribute("prechecked", "true");

- hvis ikke:
    CHECKBOX.setAttribute("prechecked", "false");

På onsubmit spørger du:
function tjekChBoxes(form) {
    var aElms = form.elements;
    for (var i=0,j=aElms.length; i<j; i++) if (aElms[i].type=="checkbox"&&(aElms[i].getAttribute("prechecked")!=aElms[i].checked)) return false;
    return true;
}
Avatar billede dennish Nybegynder
19. september 2007 - 16:04 #17
Tusinde tak olebole og nielle. Min løsning blev følgende.

var preCheckedModerators = new Array();
function checkCheckBoxes(form) {
    var postCheckedModerators = new Array();   
    var equivalent = true;
    for(i = 0; i< form.selectedGroups.length;i++) {
        if(form.selectedGroups[i].checked) {
            postCheckedModerators[postCheckedModerators.length]=form.selectedGroups[i].value;
        }
    }
    for(var k=0; k < preCheckedModerators.length; k++) {
        var found = false;
        for(var j=0; j < postCheckedModerators.length; j++) {
            if(preCheckedModerators[k]==postCheckedModerators[j]) {
                found = true;
                break;
            }
        }
        if(!found) {
            equivalent = false;
        }
    }
    if(!equivalent) {
        if (confirm('Are you sure you want to delete moderator?')) {
            return true;
        }
        return false;
    }
}

function init() {
    var objInput = document.getElementsByTagName('input');
    for(var i=0; i < objInput.length; i++) {
        if(objInput[i].getAttribute('type') == 'checkbox') {
            if(objInput[i].checked) {
                preCheckedModerators[preCheckedModerators.length] =  objInput[i].value;
            }
        }   
    }
}
olebole>>
Det foreslag ser rigtigt smart ud. Vil prøve at implementere det når jeg får mere tid. Men pga manglede tid blev løsningen som ovenstående :-)
Avatar billede dennish Nybegynder
19. september 2007 - 16:04 #18
smide i begge to ikke lige et svar
Avatar billede olebole Juniormester
19. september 2007 - 17:25 #19
- gerne  ;o)
Avatar billede nielle Nybegynder
19. september 2007 - 18:23 #20
Svar :^)

Giv du bare de fleste til olebole - han har vist trukket det største læs på denne her!
Avatar billede olebole Juniormester
19. september 2007 - 19:20 #21
- du skal ikke kalde mig et læs!
Avatar billede roenving Novice
21. september 2007 - 15:42 #22
Hvadfor ikke ?-)
Avatar billede nielle Nybegynder
27. september 2007 - 19:31 #23
Så mangler du bare at acceptere svarene :^)
Avatar billede olebole Juniormester
27. september 2007 - 19:46 #24
roenving >> for en las føles kan det som et los at blive kaldt et læs i stedet for et lys. Du ka' sæ'l være en lus ...nå!  ;D
Avatar billede olebole Juniormester
27. september 2007 - 19:47 #25
argh ... "for en las kan det føles ..."
Avatar billede nielle Nybegynder
28. september 2007 - 06:50 #26
Ren poesi :^)
Avatar billede roenving Novice
28. september 2007 - 16:22 #27
>>ole

-- og du kan være en løs Lis, eller less låst !-)
Avatar billede olebole Juniormester
28. september 2007 - 19:04 #28
- og således smigret til tårer lagde han sit svar  :)
Avatar billede olebole Juniormester
28. september 2007 - 19:06 #29
- hov, det havde jeg jo lagt for længst!  :D
Avatar billede nielle Nybegynder
03. oktober 2007 - 17:34 #30
Takker for point :^)
Avatar billede olebole Juniormester
03. oktober 2007 - 17:35 #31
Tak for points  ;o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester