Just nu i M3-nätverket
Gå till innehåll

Bygga ihop en array i en for next loop


csone

Rekommendera Poster

Hello 

Jag har ett problem vid skapandet av en dynamisk graf.

Jag försöker göra något i stil med det här...

 

var linje_1 = []

var linje_2 = []

 

for( var i = 0; i < data.length; i++) {

arraynam = 'linje_'+data[];

   arraynam.push({ label: data.x_+''+sid[a]+'', y: data.y_+''+sid[a]+'' })

}

 

"Lösningen" ovan blir undefined.

Jag vill alltså bygga ihop arraynamnet onthefly i for next loopen men det fungerar dåligt. Det hjälper liksom inte heller att JS inte är min paradgren :-)

 

Har kört trial and error ett tag utan att få det till att funka.

 

Tacksam för förslag och input.

/csone

 

 

 

 

 

Länk till kommentar
Dela på andra webbplatser

ChromaWoods

Det är svårt att debugga din lösning utan att veta vad som finns utanför den där specifika kodsnutten. Ett tips är att skapa ett reducerat exempel på t.ex jsbin eller CodePen. Vad är data, vad innehåller den? Vad är linje_1? Vad är linje_2? Förklara hur koden är tänkt att fungera så kommer dina chanser att få ett tillfredställande svar att öka markant.

 

Men hur som helst.. ett uppenbart fel är att du tilldelar arraynam ett strängvärde och du kan därför inte köra push på den eftersom push är en metod som arrayer har, inte strängar. Du kan inte skapa en array på det viset. Men även om det hade gått så hade din kod misslyckats eftersom du inte använder räknaren (i) i 'linje_'+data[].

 

Jag förstår inte varför du försöker skapa en massa arrayer med arbiträra namn, hur ska du använda dem sedan?

Länk till kommentar
Dela på andra webbplatser

vill du att det ska se ut  så här ?

 

data = array(

           1 => array('y' => 12 , x => 13, z => 44 , b => 56 ),

           2 => array('y' => 1 , x => 3, z => 54 , b => 36 ),

}

Länk till kommentar
Dela på andra webbplatser

Ibland när man sitter i flera timmar men ett problem är det svårt att beskriva på ett bra sätt och beskrivning blir något slarvig. Ber om ursäkt för det.

Har hur som helst hittat ett lösningsförslag med följande...

 

var lines = {
linje_1: [],
linje_2: []
};

for (var i = 0; i < data.length; i++) {
var arrayname = 'linje_' + data[i];
lines[arrayname].push({ label: data[i].x_ + sid[a], y: data[i].y_ + sid[a]});
}

 

Det som skulle göras var alltså att använda en json feed - http://212.181.30.156/webapp/json/jsontest.asp?sid=2,3 - med tempvärden och presentera den i en graf - http://canvasjs.com/editor/?id=http://canvasjs.com/example/gallery/line/moble_subscriptions/ -

 

anledningen till att jag behövde skapa arrays i loopen är att antalet linjer/sensorer kan variera - ex  sid=2/sid=2,3,5 osv. "sid" i requesten är alltså dom olika givarna och via x värdet i json kan jag identifiera givarna (x1 = givare1, x2=givare2 osv.) 

 

I skrivande stund har jag detta...

http://212.181.30.156/webapp/graf_multiple1.asp

Går iofs att göra en fullösning där man räknar antal sid, använder if satser och begränsar antalet multipla givare.

 

/csone

Länk till kommentar
Dela på andra webbplatser

//Av nån anledning verkar inte hela mitt inlägg visas så här kommer det igen//

 

Ibland när man sitter i flera timmar men ett problem är det svårt att beskriva på ett bra sätt och beskrivning blir något slarvig. Ber om ursäkt för det.

Har hur som helst hittat ett lösningsförslag med följande...

 

var lines = {

linje_1: [],

linje_2: []

};

 

for (var i = 0; i < data.length; i++) {

var arrayname = 'linje_' + data;

lines[arrayname].push({ label: data.x_ + sid[a], y: data.y_ + sid[a]});

}

 

Det som skulle göras var alltså att använda en json feed - http://212.181.30.156/webapp/json/jsontest.asp?sid=2,3 - med tempvärden och presentera den i en graf - http://canvasjs.com/editor/?id=http://canvasjs.com/example/gallery/line/moble_subscriptions/ -

 

anledningen till att jag behövde skapa arrays i loopen är att antalet linjer/sensorer kan variera - ex  sid=2/sid=2,3,5 osv. "sid" i requesten är alltså dom olika givarna och via x värdet i json kan jag identifiera givarna (x1 = givare1, x2=givare2 osv.) 

 

I skrivande stund har jag detta...


Går iofs att göra en fullösning där man räknar antal sid, använder if satser och begränsar antalet multipla givare.

 

/csone

Länk till kommentar
Dela på andra webbplatser

ChromaWoods

Ok nu börjar det klarna. Cool app förresten. :)

 

Kollade på din JSON-struktur. Den är vad jag förstår helt platt, dvs datapunkterna ligger kommaseparerade i en enda lång rad oavsett vilken linje de tillhör? Funderar på om lösningen skulle bli betydligt enklare om JSON-strukturen kunde göra den indelningen från början, så att du slipper iterera igenom dem i JavaScriptet. Jag tänker något i den här stilen:

[
  { x1: [{ /*datapunkter*/ }] },
  { x2: [{ /*datapunkter*/ }] },
  { x3: [{ /*datapunkter*/ }] }
]

Eller:

[
  [ /*datapunkter för x1*/ ],
  [ /*datapunkter för x2*/ ],
  [ /*datapunkter för x3*/ ]
]

Fast backend-systemet kanske inte kan leverera datat på det sättet?

Länk till kommentar
Dela på andra webbplatser

Tack! :-)

Ska prova lite med lösningsförslaget med dom dynamiskt skapade arrayerna. I hårdkodat läge blir det exakt som jag vill. Så kanske i nästa steg det blir att effektivisera json datan. Skulle egentligen velat ha hela graflinje datan från json - då får jag möjlighet att styra utseendet på ett enklare sätt (har provat nedan men fick det inte till att funka)

{        
type: "line",
lineThickness:3,
showInLegend: true,           
name: "USA",        
axisYType:"secondary",
dataPoints: [
{ x: new Date(2001, 00), y: 0.16 },
{ x: new Date(2002, 0), y: 0.17 },
{ x: new Date(2003, 0), y: 0.18},
{ x: new Date(2004, 0), y: 0.19 },
{ x: new Date(2005, 0), y: 0.20 },
{ x: new Date(2006, 0), y: 0.23 },
{ x: new Date(2007, 0), y: 0.261 },
{ x: new Date(2008, 0), y: 0.289  },
{ x: new Date(2009, 0), y: 0.3 },
{ x: new Date(2010, 0), y: 0.31 },
{ x: new Date(2011, 0), y: 0.32 },
{ x: new Date(2012, 0), y: 0.33 }
]
}
Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...