for loop met object in javascript.

Status
Niet open voor verdere reacties.

backnext

Gebruiker
Lid geworden
29 apr 2016
Berichten
176
Ik maak een website met spraak met behulp van responsiveVoice.
Met responsiveVoice.setTextReplacements is het mogelijk om 'oude woorden' te vervangen door 'nieuwe'.

De code daarvoor is:

Code:
 responsiveVoice.setTextReplacements([
        {
            searchvalue: "oud",
            newvalue: "nieuw"
        }
    ]);

Nu wil ik een lijst van die woorden gebruiken. Maar het lukt niet om dit in een for loop te zetten:
De lijst bevat een kolom genaamd 'oud' en een kolom genaamd 'nieuw'.

Code:
var aantalItems = jsonResponse.rows.length;
for (var q = 1; q < aantalItems + 1; q++) {
    responsiveVoice.setTextReplacements([
        {
            searchvalue: jsonResponse.rows[q].oud,
            newvalue: jsonResponse.rows[q].nieuw
        }
    ]);
}
 
Ik snap de for loop niet helemaal. Dit lijkt mij voldoende:
Code:
var arrObjRows = [{
    searchvalue:"FIETS", newvalue:"AUTO"
}, {
    searchvalue:"APPEL", newvalue:"PEER"
}];
responsiveVoice.setTextReplacements(arrObjRows);

Of heb je een andere var rows ? Wat is de reden dat je hier met JSON werkt?
 
Laatst bewerkt:
Hoe je door het object in de array voor "setTextReplacements() kan lopen

Code:
var arrObjRows = [{
    searchvalue: "Auto", newvalue: "Fiets"
}, {
    searchvalue: "Peer", newvalue: "Appel"
}];

// responsiveVoice.setTextReplacements(arrObjRows);

var key, obj, prop;
for (key in arrObjRows) {
   obj = arrObjRows[key];
   for (prop in obj) {
      console.log(prop + " = " + obj[prop]);
   }
}
 
Laatst bewerkt:
Dag bron, bedankt voor de tip.
De lijst met woorden wordt opgemaakt in een excel-bestandje dat vooraf naar de server gebracht wordt als json-bestand.
Zo kunnen de woorden toegevoegd worden zonder in het script te moeten werken.

Dus heb ik in een servermap: ...../woordenVervangen.json

Ik haal de lijst op met ajax en dan:

Code:
var jsonResponse = JSON.parse(FileText);

om met jouw tip verder te gaan probeer ik dit:

Code:
 var aantalItems = jsonResponse.rows.length;
        for (var q = 1; q < aantalItems; q++) {
            var arrObjRows = [{
                searchvalue: jsonResponse.rows[q].oud, newvalue: jsonResponse.rows[q].nieuw
            }
            }];
            responsiveVoice.setTextReplacements(arrObjRows);
            var key, obj, prop;
            for (key in arrObjRows) {
                obj = arrObjRows[key];
                for (prop in obj) {
                    console.log(prop + " = " + obj[prop]);
                }
            }

Zo krijg ik enkel de laatste woorden uit de lijst. Hoe kan ik de volledige lijst samenstellen met de 'for-loop'?
 
Laatst bewerkt:
Ik denk dat ik het gevonden heb op deze manier:

Code:
 var arrObjRows =
            [{
                searchvalue: jsonResponse.rows[0].oud, newvalue: jsonResponse.rows[0].nieuw
            }];
        var aantalItems = jsonResponse.rows.length;
        for (q = 1; q < aantalItems; q++) {
            arrObjRows.push({ searchvalue: jsonResponse.rows[q].oud, newvalue: jsonResponse.rows[q].nieuw });
                var key, obj, prop;
                for (key in arrObjRows) {
                    obj = arrObjRows[key];
                    for (prop in obj) {
                        console.log(prop + " = " + obj[prop]);
                    }
                }
            }
        responsiveVoice.setTextReplacements(arrObjRows);
 
Je vervangt telkens hetzelfde object in de array, aan het eind van de for loop heb je dus alleen één (het laatste) item.
De bedoeling is dat je begint met een lege array en daarin telkens een object (oud/nieuw woord) toevoegt. Het volgende kan ik niet testen omdat ik jouw jsonResponse niet heb.
Code:
var aantalItems = jsonResponse.rows.length;
var q, tmpObject, replaceArray = [];
for (q = 1; q < aantalItems; q++) {
    tmpObject = {
        searchvalue: jsonResponse.rows[q].oud,
        newvalue: jsonResponse.rows[q].nieuw
    };
    replaceArray.push(tmpObject);
}
console.log(replaceArray);
responsiveVoice.setTextReplacements(replaceArray);

Je kan ook responsiveVoice binnen de for loop zetten, elke wijziging wordt dan direct uitgesproken.
Code:
var aantalItems = jsonResponse.rows.length;
var q, replaceArray = [];
for (q = 1; q < aantalItems; q++) {
    replaceArray = [{
        searchvalue: jsonResponse.rows[q].oud,
        newvalue: jsonResponse.rows[q].nieuw
    }];
    responsiveVoice.setTextReplacements(replaceArray);
}

Noot: dit stukje codeheb je denk ik niet nodig, het is slechts een stukje code waarmee je een object kan omzetten in losse strings.
Code:
var key, obj, prop;
for (key in arrObjRows) {
    ….
}

Het voordeel van for (… in …) is dat je niet van tevoren de length hoeft te bepalen. Je kan het volgende proberen.
Code:
var aantalItems = jsonResponse.rows.length;
for (q = 1; q < aantalItems; q++) {
    ....
}

wordt

var key;
for (key in jsonResponse.rows) {
    ....
}
 
Laatst bewerkt:
ok, bedankt. Dat werkt soepel.
Voor de volledigheid:
ik heb de 'q' vervangen door 'key':

Code:
searchvalue: jsonResponse.rows[key].oud, newvalue: jsonResponse.rows[key].nieuw
 
Maar dan toch nog een vraagje:
Op deze pagina wordt uitgelegd dat je bij een for in loop moet controleren of de eigenschap bij het object hoort.
op deze manier:

Code:
for (var property in object) {
  if (object.hasOwnProperty(property)) {
    // Do things here
  }
}
Is dat hier niet nodig?
 
Met hasOwnProperty(...) controleer je of de property een directe property van het object is (het geeft true of false). Dit is in deze mooie object structuur overbodig denk ik. Maar het kan geen kwaad deze test ertussen te voegen.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan