Hoe array doorlopen in jQuery?

Ik probeer een array te doorlopen. Ik heb de volgende code:

var currnt_image_list= '21,32,234,223';
 var substr = currnt_image_list.split(','); // array here

Ik probeer alle gegevens uit de array te krijgen. Kan iemand me alsjeblieft op het juiste pad leiden?


Antwoord 1, autoriteit 100%


(Update: Mijn andere antwoord hierlegt de niet-jQuery-opties veel grondiger uit. De derde optie hieronder, jQuery.each, staat er echter niet in.)


Vier opties:

Algemene lus:

var i;
for (i = 0; i < substr.length; ++i) {
    // do something with `substr[i]`
}

of in ES2015+:

for (let i = 0; i < substr.length; ++i) {
    // do something with `substr[i]`
}

Voordelen: eenvoudig, geen afhankelijkheid van jQuery, gemakkelijk te begrijpen, geen problemen met het behouden van de betekenis van thisin de hoofdtekst van de lus, geen onnodige overhead van functieaanroepen (bijvoorbeeld in theoriesneller, hoewel je in feite zoveel elementen zou moeten hebben dat de kans groot is dat je andere problemen zou hebben; details).

ES5’s foreach:

Vanaf ECMAScript5 hebben arrays een foreach-functie die het gemakkelijk maakt om door de array te lopen:

substr.forEach(function(item) {
    // do something with `item`
});

Link naar documenten

(Opmerking: er zijn veel andere functies, niet alleen foreach; zie het antwoord waarnaar hierboven wordt verwezenvoor details.)

Voordelen: Declaratief, kan een vooraf gebouwde functie voor de iterator gebruiken als je er een bij de hand hebt, als je loop-body complex is, is het bereik van een functieaanroep soms handig, geen ivariabele in uw bereik.

Nadelen: als je thisgebruikt in de bevattende code en je wilt thisgebruiken in je foreachterugbellen, moet je ofwel A) het in een variabele plakken zodat je het binnen de functie kunt gebruiken, B) het als tweede argument doorgeven aan foreachdus foreachstelt het in als thistijdens de callback, of C) Gebruik een ES2015+ pijlfunctie, die sluit over this. Als je een van deze dingen niet doet, zal in de callback thisundefinedzijn (in strikte modus) of het globale object (window) in losse modus. Er was een tweede nadeel dat foreachniet universeel werd ondersteund, maar hier in 2018 is de enige browser die je tegenkomt die geen foreachheeft is IE8 (en het kan daar ook niet goedworden ingevuld).

ES2015+’s for-of:

for (const s of substr) { // Or `let` if you want to modify it in the loop body
    // do something with `s`
}

Zie het antwoord dat bovenaan dit antwoord is gelinkt voor details over hoe dat werkt.

Voordelen: eenvoudig, rechttoe rechtaan, biedt een variabele met een ingesloten bereik (of constante, in het bovenstaande) voor de invoer uit de array.

Nadelen: wordt in geen enkele versie van IE ondersteund.

jQuery.each:

jQuery.each(substr, function(index, item) {
    // do something with `item` (or `this` is also `item` if you like)
});

(Link naar documenten)

Voordelen: allemaal dezelfde voordelen als foreach, plus je weet dat het er is omdat je jQuery gebruikt.

Nadelen: als je thisgebruikt in de bevattende code, moet je het in een variabele stoppen zodat je het binnen de functie kunt gebruiken, aangezien thisbetekent iets anders binnen de functie.

Je kunt het thisding echter vermijden door $.proxy:

jQuery.each(substr, $.proxy(function(index, item) {
    // do something with `item` (`this` is the same as it was outside)
}, this));

…of Function#bind:

jQuery.each(substr, function(index, item) {
    // do something with `item` (`this` is the same as it was outside)
}.bind(this));

…of in ES2015 (“ES6”), een pijlfunctie:

jQuery.each(substr, (index, item) => {
    // do something with `item` (`this` is the same as it was outside)
});

Wat NIETte doen:

Gebruik nietfor..inhiervoor (of als je dat wel doet, doe het dan met de juiste voorzorgsmaatregelen). Je zult mensen zien zeggen tegen (in feite was er hier kort een antwoord dat dat zei), maar for..indoet niet wat veel mensen denken dat het doet (het doet iets dat nog nuttiger is! ). Met name for..indoorloopt de opsombare eigenschapsnamen van een object (niet de indexen van een array). Aangezien arrays objecten zijn en hun enige opsombare eigenschappen standaardde indexen zijn, lijkt het meestal te werken in een neutrale implementatie. Maar het is geen veilige veronderstelling dat je het daar zomaar voor kunt gebruiken. Hier is een verkenning: http://jsbin.com/exohi/3

Ik zou het ‘niet doen’ hierboven moeten verzachten. Als je te maken hebt met schaarse arrays (de array heeft bijvoorbeeld in totaal 15 elementen, maar hun indexen zijn om de een of andere reden verspreid over het bereik van 0 tot 150.000, en dus is de length150.001), enals u passende beveiligingen gebruikt zoals hasOwnPropertyen het controleren van de naam van de eigenschap echt numeriek is (zie link hierboven), kan for..ineen volkomen redelijke manier om veel onnodige lussen te vermijden, omdat alleen de bevolkte indexen worden opgesomd.


Antwoord 2, autoriteit 16%

jQuery.each()

jQuery.each()

jQuery.each(array, callback)

matrix-iteratie

jQuery.each(array, function(Integer index, Object value){});

object-iteratie

jQuery.each(object, function(string propertyName, object propertyValue){});

voorbeeld:

var substr = [1, 2, 3, 4];
$.each(substr , function(index, val) { 
  console.log(index, val)
});
var myObj = { firstName: "skyfoot"};
$.each(myObj, function(propName, propVal) {
  console.log(propName, propVal);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Antwoord 3, autoriteit 4%

JQuery is hier niet nodig, alleen een For-lus werkt:

var substr = currnt_image_list.split(',');
for(var i=0; i< substr.length; i++) {
  alert(substr[i]);
}

Antwoord 4, autoriteit 3%

Optie 1: de traditionele For-loop

De basis

Een traditionele For-loop heeft drie componenten:

  1. de initialisatie :uitgevoerd voordat het zoekblok de eerste keer wordt uitgevoerd
  2. de voorwaarde:controleert elke keer een voorwaarde voordat het lusblok wordt uitgevoerd, en sluit de lus af als deze niet waar is
  3. de nabeschouwing:wordt elke keer uitgevoerd nadat het lusblok is uitgevoerd

Deze drie componenten worden van elkaar gescheiden door een ;symbool. Inhoud voor elk van deze drie componenten is optioneel, wat betekent dat het volgende de meest minimale For-loop is die mogelijk is:

for (;;) {
    // Do stuff
}

Natuurlijk moet je een if(condition === true) { break; }of een if(condition === true) { return; }ergens in die For-lus om het te laten stoppen met draaien.

Gewoonlijk wordt de initialisatie echter gebruikt om een index te declareren, de voorwaarde wordt gebruikt om die index te vergelijken met een minimum- of maximumwaarde, en de bijzaak wordt gebruikt om de index te verhogen :

for (var i = 0, length = 10; i < length; i++) {
    console.log(i);
}

Een traditionele For-loop om door een array te lussen

De traditionele manier om door een array te lussen, is deze:

for (var i = 0, length = myArray.length; i < length; i++) {
    console.log(myArray[i]);
}

Of, als je er de voorkeur aan geeft achteruit te lussen, doe je dit:

for (var i = myArray.length - 1; i > -1; i--) {
    console.log(myArray[i]);
}

Er zijn echter veel variaties mogelijk, zoals bijv. deze :

for (var key = 0, value = myArray[key], var length = myArray.length; key < length; value = myArray[++key]) {
    console.log(value);
}

… of deze …

var i = 0, length = myArray.length;
for (; i < length;) {
    console.log(myArray[i]);
    i++;
}

… of deze :

var key = 0, value;
for (; value = myArray[key++];){ 
    console.log(value);
}

Wat het beste werkt, is grotendeels een kwestie van zowel persoonlijke smaak als de specifieke gebruikssituatie die u implementeert.

Opmerking:

Elk van deze varianten wordt door alle browsers ondersteund, ook door de zeer oude!


Optie 2: De while-loop

Een alternatief voor een For-loop is een while-loop. Om door een array te lopen, kunt u dit doen:

var key = 0;
while(value = myArray[key++]){
    console.log(value);
}

Opmerking:

Net als traditionele For-loops, worden while-loops zelfs door de oudste browsers ondersteund.

Ook kan elke while-lus worden herschreven als een For-lus. Bijvoorbeeld, de while-loop hierboven gedraagt zich op exact dezelfde manier als deze For-loop :

for(var key = 0;value = myArray[key++];){
    console.log(value);
}

Optie 3: for...inen for...of

In JavaScript kunt u dit ook doen:

for (i in myArray) {
    console.log(myArray[i]);
}

Dit moet echter met zorg worden gebruikt, aangezien het zich niet in alle gevallen hetzelfde gedraagt als een traditionele For-loop, en er zijn mogelijke bijwerkingen waarmee rekening moet worden gehouden. Zie Waarom gebruikt ” for…in” met array-iteratie een slecht idee?voor meer details.

Als alternatief voor for...inis er nu ook voor for...of. Het volgende voorbeeld toont het verschil tussen een for...of-lus en een for...in-lus:

var myArray = [3, 5, 7];
myArray.foo = "hello";
for (var i in myArray) {
  console.log(i); // logs 0, 1, 2, "foo"
}
for (var i of myArray) {
  console.log(i); // logs 3, 5, 7
}

Opmerking:

Je moet er ook rekening mee houden dat geen enkele versie van Internet Explorer for...ofondersteunt (Edge 12+doet) en dat for...inminimaal IE10 vereist.


Optie 4: Array.prototype.forEach()

Een alternatief voor For-loops is Array.prototype.forEach(), dat de volgende syntaxis gebruikt:

myArray.forEach(function(value, key, myArray) {
    console.log(value);
});

Opmerking:

Array.prototype.forEach()wordt ondersteund door alle moderne browsers, evenals IE9+.


Optie 5: jQuery.each()

Naast de vier andere genoemde opties, had jQuery ook zijn eigen foreachvariant.

Het gebruikt de volgende syntaxis:

$.each(myArray, function(key, value) {
    console.log(value);
});

Antwoord 5, autoriteit 3%

Gebruik de each()functie van jQuery.

Hier is een voorbeeld:

$.each(currnt_image_list.split(','), function(index, value) { 
  alert(index + ': ' + value); 
});

Antwoord 6

Gebruik jQuery each(). Er zijn andere manieren, maar ze zijn allemaal voor dit doel ontworpen.

$.each(substr, function(index, value) { 
  alert(value); 
});

En zet de komma niet achter het laatste cijfer.


Antwoord 7

ES6-syntaxis met pijlfunctie en interpolatie:

var data=["a","b","c"];
$(data).each((index, element) => {
        console.log(`current index : ${index} element : ${element}`)
    });

Antwoord 8

U kunt een for()-lus gebruiken:

var things = currnt_image_list.split(','); 
for(var i = 0; i < things.length; i++) {
    //Do things with things[i]
}

Antwoord 9

Probeer dit:

$.grep(array, function(element) {
})

Antwoord 10

Alternatieve manieren van iteratie door array/string met bijwerkingen

var str = '21,32,234,223';
var substr = str.split(',');
substr.reduce((a,x)=> console.log('reduce',x), 0)        // return undefined
substr.every(x=> { console.log('every',x); return true}) // return true
substr.some(x=> { console.log('some',x); return false})  // return false
substr.map(x=> console.log('map',x));                    // return array
str.replace(/(\d+)/g, x=> console.log('replace',x))      // return string

Antwoord 11

 for(var key in substr)
{
     // do something with substr[key];
} 

Other episodes