1

กระทู้: ฝีก loop JavaScript

เริ่มปีใหม่ตั้งใจว่าจะฝึกพื้นฐานภาษานี้สักหน่อยครับ ปัญหาที่น่าห่วงคือ loop ครับ เลยไปเจอเค้าสอนเขียนลูปโดยให้ตัวอย่างมาดังนี้

<html><title>teachp02.htm</title>
<body><font face="fixedsys" size=0>
<script language="JavaScript" type="text/javascript">
<!--
var k = 5;
for(i=1;i<=k;i++) {
  document.write( i + " - ")
  for(j=1;j<=i;j++) {
    document.write( 11 - j - i )
  }
  document.write("<br>")
}
// -->
</script>
</body></html>

ส่วนผลลัพท์ก็ดังนี้ครับ

1 - 9
2 - 87
3 - 765
4 - 6543
5 - 54321

คำถามคือ ตรงลำดับที่ 2 - 87 อยากรู้ว่าทำไมได้ 87 ครับ ผมจะได้รู้ซะทีว่าโปรแกรมมันคิดยังไง

2

ตอบ: ฝีก loop JavaScript

คำตอบอยู่ที่

(11 - j - i) ครับ (ไม่ต้องคิดเยอะ เป็นแค่คณิตศาสตร์ ลบเลข ธรรมดา)

การวน loop ซ้อน loop แบบนี้ ให้แยกตัวแปร ออกมาเป็นสองตัว เพราะมันมีสองชั้น
เวลาทดสอบการรันในหัวเรา ก็ให้ mark เอาไว้ ว่า loop นี้ ตัวนึงมีค่าอะไร อีกตัวมีค่าอะไร แล้วตอนวนทีละรอบก็จะได้ไม่ งง ว่าตอนนี้ ตัวนึงมีค่าอะไรอยู่ และอีกตัวมีค่าอะไรอยู่

ถ้ายังงง นึกไม่ค่อยออก ให้เขียนใส่กระดาษ ทีละบรรทัดเลยครับ (ผมก็เคยเขียนมาก่อน)
บรรทัดนึง ถือเป็น loop 1 รอบ โดยระบุไว้ว่า รอบนี้ i เท่าไร j เท่าไร แล้วลองเข้า loop รอบต่อไป ก็ บวกค่าเพิ่มตามเงื่อนไขครับ

ที่แน่ๆเลย ก็คือ ค่า i และค่า j ไม่ได้เพิ่มขึ้นพร้อมกันครับบ ถ้าเพิ่มพร้อมกันแสดงว่าเข้าใจผิดอยู่

3

ตอบ: ฝีก loop JavaScript

ผมหาวิธีได้แล้วละครับ ก่อนอื่น ลูปนอกหากเงื่อนไขเป็นจริง ก็จะทำบรรทัดถัดไป
พอเข้าไปใน nested loop ก็จะวน ตั้งแต่ค่าเริ่มต้นเช่น j=1; j<=9; j++ ก็จะวนไปถึง 9 รอบ แล้วพอถึงรอบที่ 10 เงื่อนไขจะกลายเป็น false ก็จะหลุดจาก loop นี้ และทำบรรทัดถัดไป ผมเลยลองทำอีกอันเพื่อความชัวร์ดังนี้ครับ

<html><title>teachp01.htm</title>
<body><font face="fixedsys" size=0><pre>
<script language="JavaScript" type="text/javascript">
<!--
var k = 9;
for(i=1;i<=k;i++) {
  for(j=1;j<=k-i+1;j++) { document.write( " " ) }
  for(j=1;j<=i;j++) { document.write( j ) }
  document.write( i )
  for(j=i;j>=1;j--) { document.write( j ) }
  document.write("<br>")
}
// -->
</script>
</body></html>

ผลที่ได้ก็เป็นดังนี้

         111
        12221
       1233321
      123444321
     12345554321
    1234566654321
   123456777654321
  12345678887654321
 1234567899987654321

ส่วนวิธีของผมก็เป็นแบบนี้

Big loop
Outer loop First Round
    i=1; 1<=9 true
    

First Nested Loop
Round 1
    j=1; 1<=9-1+1 true
    So it's wrote " "
Round 2
    j=2; 2<=9-1+1 true
    So it's wrote " "
Round 3
    j=3; 3<=9-1+1 true
    So it's wrote " "
Round 4
    j=4; 4<=9-1+1 true
    So it's wrote " "
Round 5
    j=5; 5<=9-1+1 true
    So it's wrote " "
Round 6
    j=6; 6<=9-1+1 true
    So it's wrote " "
Round 7
    j=7; 7<=9-1+1 true
    So it's wrote " "
Round 8
    j=8; 8<=9-1+1 true
    So it's wrote " "
Round 9
    j=9; 9<=9-1+1 true
    So it's wrote " "
Round 10
    j=10; 10<=9-1+1 false
It's wrote space for 9 times at first round and go to next loop.

Second Nested Loop (j=1;j<=i;j++)
Round 1
    j=1; 1<=1 true
    So it's wrote 1
Round 2
    j=2; 2<=1 false
It's wrote only number 1 at one time.
And wrote i = 1 for next line.

Third Nested Loop (j=i;j>=1;j--)
Round 1
    j=1; 1>=1 true
    So it's wrote 1
Round 2
    j=0; 0>=1 false
    So it's go to next process wrote <br/>
    
First Roll wrote spec 9 time + 111<br/>
-----------------
Big loop
Outer loop Second Round (i=1;i<=k;i++)
    i=2; 2<=9 true
    

First Nested Loop (j=1;j<=k-i+1;j++)
Round 1
    j=1; 1<=9-2+1 true
    So it's wrote " "
Round 2
    j=2; 2<=9-2+1 true
    So it's wrote " "
Round 3
    j=3; 3<=9-2+1 true
    So it's wrote " "
Round 4
    j=4; 4<=9-2+1 true
    So it's wrote " "
Round 5
    j=5; 5<=9-2+1 true
    So it's wrote " "
Round 6
    j=6; 6<=9-2+1 true
    So it's wrote " "
Round 7
    j=7; 7<=9-2+1 true
    So it's wrote " "
Round 8
    j=8; 8<=9-2+1 true
    So it's wrote " "
Round 9
    j=9; 9<=9-2+1 false
    It's wrote space for 8 times at first round and go to next loop.
    Go to next loop

Second Nested Loop (j=1;j<=i;j++)
Round 1
    j=1; 1<=2 true
    So it's wrote 1
Round 2
    j=2; 2<=2 true
    So it's wrote 2
Round 3
    j=3; 3<=2 false
It's wrote number 1 and 2.
And wrote i = 2 for next line.

Third Nested Loop (j=i;j>=1;j--)
Round 1
    j=2; 2>=1 true
    So it's wrote 2
Round 2
    j=1; 1>=1 true
    So it's wrote 1
Round 2
    j=0; 0>=1 false
    So it's go to next process wrote <br/>
    
Second Roll wrote spec 8 time + 12221<br/>

คราวนี้ขอถามละครับ มีวิธีสังเกตที่มันง่ายกว่านี้ไหมครับ ไล่แบบนี้นานเป็นชั่วโมงเลยครับกว่าจะจบข้อนี้เนี่ย

แก้ไขล่าสุดโดย poomrin (2014-01-08 04:37:25)

4

ตอบ: ฝีก loop JavaScript

ไล่ในกระดาษเสียเวลาแน่นอนครับ ปกติ ถ้าเยอะๆและซับซ้อนแบบนี้ ผมก็เขียนให้มันรันแล้วดูผลเลยครับ เพราะว่า ชีวิตจริง เราไม่ค่อยได้เจอเงื่อนไขที่ซับซ้อนแบบนี้เท่าไรครับ แค่ซ้อนสองชั้นนี่ก็ ปีสองปี จะเจอสักงานนึงครับ

ถ้าจะรันในหัว ลองรันช่วงสั้นๆ โดยใช้การแทนค่า ช่วงต้น กลาง ปลาย แล้วดูผลเอาครับ โดยประเมินผลก่อน ว่ามันต้องเป็นหน้าตาแบบไหน(ที่ถูกต้อง ควรจะเป็น)

สมมุติ loop ใหญ่ รัน 9 รอบ เราอาจจะแทนค่า loop ใหญ่ด้วย 1,2 และ 5,6 และ 8,9 ก็จะลดจำนวน รอบที่ต้องคิดไปได้มาก หรือจริงๆ 1 5 9 ก็น่าจะพอประเมินภาพคร่าวๆได้แล้ว ว่าน่าจะถูกหรือเปล่า

อีกทั้ง loop แบบนี้ มันค่อนข้างทำงานเป็นลูกโซ่ ถ้ามีจุดนึง เพี้ยน มันจะสังเกตุเห็นความเพี้ยนเพิ่มขึ้น ยิ่งไปรอบท้ายๆนี้เพี้ยนหลุดโลกไปเลย

งานที่ซับซ้อนแบบที่ต้องใช้ loop พวกนี้ ผมเจอล่าสุด คือโจทย์เรื่องการแปลงตัวเลขจำนวน ให้เป็นคำอ่าน ในภาษาไทย
เช่น 12351 = หนึ่งหมื่นสองพันสามร้อยห้าสิบเอ็ด อะไรแบบนี้ครับ
แต่โจทย์นี้ ก็ไม่ใช่งานที่ต้องเขียนโค้ดจริง เป็นโจทย์ทดสอบ algorithm เท่านั้นครับ แต่จะลองเขียนตามโจทย์ที่ผมเล่าให้ฟังนี้ก็ได้นะครับ มึนดี 5555 ตอนนั่งคิด algorithm ใช้เวลาอยู่สัก ครึ่งชั่วโมงได้ครับ รวมทั้งดัก bug ด้วยนะ เช่น 11351 ก็ต้องไม่อ่านว่า หนึ่งหมื่นหนึ่งพันสามร้อยห้าสิบหนึ่ง หรือ ต้องไม่อ่านว่า หนึ่งหมื่นเอ็ดพันสามร้อย...... อะไรแบบนี้ และยังต้องคิดเผื่อไปถึงการ input 11222334568795556 (ล้านล้านขึ้นไป)

จริงๆ ผมจำโจทย์นี้ได้ว่า เมื่อตอนที่ฝึกเขียนภาษาซี เมื่อสัก 10 ปีก่อนได้(รู้สึกแก่ขึ้นมาทันที) ว่ามีโจทย์จากหนังสือเล่มนึง ให้เขียนโค้ดตามโจทย์นี้แหล่ะ เขียนอยู่นานเหมือนกันครับ งง และซับซ้อนมาก แต่มันฝึก skill การออกแบบการคิดได้เป็นอย่างดีเลย

5

ตอบ: ฝีก loop JavaScript

กลับมาถามอีกรอบครับเกี่ยวกับเรื่อง loop ตอนนี้ผมติดปัญหาจะเอา (,) อันสุดท้ายครับก่อนจะปิด(]) คือผมพยามที่จะลองทำให้มันเหมือนกับค่าที่ได้รับมานะครับ ไม่รู้ว่าจะเอามันออกยังไง อีกอย่างครับค่าสุดท้ายของ values มีเบิ้ลค่า 1 ตัวด้วย ไม่รู้จะแก้ยังไงครับ

var data = [
  {
    key : "Consumer Discretionary" ,
    values : [ [ 1138683600000 , 27.38478809681] , [ 1141102800000 , 27.371377218208] , [ 1143781200000 , 26.309915460827] , [ 1146369600000 , 26.425199957521] , [ 1149048000000 , 26.823411519395] , [ 1151640000000 , 23.850443591584] , [ 1154318400000 , 23.158355444054] , [ 1156996800000 , 22.998689393694] , [ 1159588800000 , 27.977128511299] , [ 1162270800000 , 29.073672469721] , [ 1164862800000 , 28.587640408904] , [ 1167541200000 , 22.788453687638] , [ 1170219600000 , 22.429199073597] , [ 1172638800000 , 22.324103271051] , [ 1175313600000 , 17.558388444186] , [ 1177905600000 , 16.769518096208] , [ 1180584000000 , 16.214738201302] , [ 1183176000000 , 18.729632971228] , [ 1185854400000 , 18.814523318848] , [ 1188532800000 , 19.789986451358] , [ 1191124800000 , 17.070049054933] , [ 1193803200000 , 16.121349575715] , [ 1196398800000 , 15.141659430091] , [ 1199077200000 , 17.175388025298] , [ 1201755600000 , 17.286592443521] , [ 1204261200000 , 16.323141626569] , [ 1206936000000 , 19.231263773952] , [ 1209528000000 , 18.446256391094] , [ 1212206400000 , 17.822632399764] , [ 1214798400000 , 15.539366475979] , [ 1217476800000 , 15.255131790216] , [ 1220155200000 , 15.660963922593] , [ 1222747200000 , 13.254482273697] , [ 1225425600000 , 11.920796202299] , [ 1228021200000 , 12.122809090925] , [ 1230699600000 , 15.691026271393] , [ 1233378000000 , 14.720881635107] , [ 1235797200000 , 15.387939360044] , [ 1238472000000 , 13.765436672229] , [ 1241064000000 , 14.6314458648] , [ 1243742400000 , 14.292446536221] , [ 1246334400000 , 16.170071367016] , [ 1249012800000 , 15.948135554337] , [ 1251691200000 , 16.612872685134] , [ 1254283200000 , 18.778338719091] , [ 1256961600000 , 16.75602606542] , [ 1259557200000 , 19.385804443147] , [ 1262235600000 , 22.950590240168] , [ 1264914000000 , 23.61159018141] , [ 1267333200000 , 25.708586989581] , [ 1270008000000 , 26.883915999885] , [ 1272600000000 , 25.893486687065] , [ 1275278400000 , 24.678914263176] , [ 1277870400000 , 25.937275793023] , [ 1280548800000 , 29.46138169384] , [ 1283227200000 , 27.357322961862] , [ 1285819200000 , 29.057235285673] , [ 1288497600000 , 28.549434189386] , [ 1291093200000 , 28.506352379723] , [ 1293771600000 , 29.449241421597] , [ 1296450000000 , 25.796838168807] , [ 1298869200000 , 28.740145449189] , [ 1301544000000 , 22.091744141872] , [ 1304136000000 , 25.079662545409] , [ 1306814400000 , 23.674906973064] , [ 1309406400000 , 23.41800274293] , [ 1312084800000 , 23.243644138871] , [ 1314763200000 , 31.591854066817] , [ 1317355200000 , 31.497112374114] , [ 1320033600000 , 26.672380820431] , [ 1322629200000 , 27.297080015495] , [ 1325307600000 , 20.174315530051] , [ 1327986000000 , 19.631084213899] , [ 1330491600000 , 20.366462219462] , [ 1333166400000 , 17.429019937289] , [ 1335758400000 , 16.75543633539] , [ 1338436800000 , 16.182906906042]]
    
  },
  {
    key : "Consumer Staples" ,
    values : [ [ 1138683600000 , 7.2800122043237] , [ 1141102800000 , 7.1187787503354] , [ 1143781200000 , 8.351887016482] , [ 1146369600000 , 8.4156698763993] , [ 1149048000000 , 8.1673298604231] , [ 1151640000000 , 5.5132447126042] , [ 1154318400000 , 6.1152537710599] , [ 1156996800000 , 6.076765091942] , [ 1159588800000 , 4.6304473798646] , [ 1162270800000 , 4.6301068469402] , [ 1164862800000 , 4.3466656309389] , [ 1167541200000 , 6.830104897003] , [ 1170219600000 , 7.241633040029] , [ 1172638800000 , 7.1432372054153] , [ 1175313600000 , 10.608942063374] , [ 1177905600000 , 10.914964549494] , [ 1180584000000 , 10.933223880565] , [ 1183176000000 , 8.3457524851265] , [ 1185854400000 , 8.1078413081882] , [ 1188532800000 , 8.2697185922474] , [ 1191124800000 , 8.4742436475968] , [ 1193803200000 , 8.4994601179319] , [ 1196398800000 , 8.7387319683243] , [ 1199077200000 , 6.8829183612895] , [ 1201755600000 , 6.984133637885] , [ 1204261200000 , 7.0860136043287] , [ 1206936000000 , 4.3961787956053] , [ 1209528000000 , 3.8699674365231] , [ 1212206400000 , 3.6928925238305] , [ 1214798400000 , 6.7571718894253] , [ 1217476800000 , 6.4367313362344] , [ 1220155200000 , 6.4048441521454] , [ 1222747200000 , 5.4643833239669] , [ 1225425600000 , 5.3150786833374] , [ 1228021200000 , 5.3011272612576] , [ 1230699600000 , 4.1203601430809] , [ 1233378000000 , 4.0881783200525] , [ 1235797200000 , 4.1928665957189] , [ 1238472000000 , 7.0249415663205] , [ 1241064000000 , 7.006530880769] , [ 1243742400000 , 6.994835633224] , [ 1246334400000 , 6.1220222336254] , [ 1249012800000 , 6.1177436137653] , [ 1251691200000 , 6.1413396231981] , [ 1254283200000 , 4.8046006145874] , [ 1256961600000 , 4.6647600660544] , [ 1259557200000 , 4.544865006255] , [ 1262235600000 , 6.0488249316539] , [ 1264914000000 , 6.3188669540206] , [ 1267333200000 , 6.5873958262306] , [ 1270008000000 , 6.2281189839578] , [ 1272600000000 , 5.8948915746059] , [ 1275278400000 , 5.5967320482214] , [ 1277870400000 , 0.99784432084837] , [ 1280548800000 , 1.0950794175359] , [ 1283227200000 , 0.94479734407491] , [ 1285819200000 , 1.222093988688] , [ 1288497600000 , 1.335093106856] , [ 1291093200000 , 1.3302565104985] , [ 1293771600000 , 1.340824670897] , [ 1296450000000 , 0] , [ 1298869200000 , 0] , [ 1301544000000 , 0] , [ 1304136000000 , 0] , [ 1306814400000 , 0] , [ 1309406400000 , 0] , [ 1312084800000 , 0] , [ 1314763200000 , 0] , [ 1317355200000 , 4.4583692315] , [ 1320033600000 , 3.6493043348059] , [ 1322629200000 , 3.8610064091761] , [ 1325307600000 , 5.5144800685202] , [ 1327986000000 , 5.1750695220792] , [ 1330491600000 , 5.6710066952691] , [ 1333166400000 , 8.5658461590953] , [ 1335758400000 , 8.6135447714243] , [ 1338436800000 , 8.0231460925212]]
  } 
];
document.write("data : [<br/>");
var dlength = data.length;
var d1 = 0;
for(var i = 0; i < dlength; i++) {
    if(d1 < dlength){
        document.write("{ key : " + data[i].key + ",<br/>");
        
        document.write("values : [");
        var k1 = 0;
        for(var k=0; k < data[i].values.length; k++) {
            if(k1 < data[i].values.length){
            document.write("[" + data[i].values[k] + "],");
            k1++;
            }
            if(k1 === data[i].values.length){
            document.write("[" + data[i].values[k] + "]");
            }
            
        }
        document.write("]<br/>},<br/>");    
        d1++;
    }
    if(d1 === dlength){
        document.write("]");    
    }
}

ผลที่ได้

data : [
{ key : Consumer Discretionary,
values : [[1138683600000,27.38478809681],[1141102800000,27.371377218208],[1143781200000,26.309915460827],[1146369600000,26.425199957521],[1149048000000,26.823411519395],[1151640000000,23.850443591584],[1154318400000,23.158355444054],[1156996800000,22.998689393694],[1159588800000,27.977128511299],[1162270800000,29.073672469721],[1164862800000,28.587640408904],[1167541200000,22.788453687638],[1170219600000,22.429199073597],[1172638800000,22.324103271051],[1175313600000,17.558388444186],[1177905600000,16.769518096208],[1180584000000,16.214738201302],[1183176000000,18.729632971228],[1185854400000,18.814523318848],[1188532800000,19.789986451358],[1191124800000,17.070049054933],[1193803200000,16.121349575715],[1196398800000,15.141659430091],[1199077200000,17.175388025298],[1201755600000,17.286592443521],[1204261200000,16.323141626569],[1206936000000,19.231263773952],[1209528000000,18.446256391094],[1212206400000,17.822632399764],[1214798400000,15.539366475979],[1217476800000,15.255131790216],[1220155200000,15.660963922593],[1222747200000,13.254482273697],[1225425600000,11.920796202299],[1228021200000,12.122809090925],[1230699600000,15.691026271393],[1233378000000,14.720881635107],[1235797200000,15.387939360044],[1238472000000,13.765436672229],[1241064000000,14.6314458648],[1243742400000,14.292446536221],[1246334400000,16.170071367016],[1249012800000,15.948135554337],[1251691200000,16.612872685134],[1254283200000,18.778338719091],[1256961600000,16.75602606542],[1259557200000,19.385804443147],[1262235600000,22.950590240168],[1264914000000,23.61159018141],[1267333200000,25.708586989581],[1270008000000,26.883915999885],[1272600000000,25.893486687065],[1275278400000,24.678914263176],[1277870400000,25.937275793023],[1280548800000,29.46138169384],[1283227200000,27.357322961862],[1285819200000,29.057235285673],[1288497600000,28.549434189386],[1291093200000,28.506352379723],[1293771600000,29.449241421597],[1296450000000,25.796838168807],[1298869200000,28.740145449189],[1301544000000,22.091744141872],[1304136000000,25.079662545409],[1306814400000,23.674906973064],[1309406400000,23.41800274293],[1312084800000,23.243644138871],[1314763200000,31.591854066817],[1317355200000,31.497112374114],[1320033600000,26.672380820431],[1322629200000,27.297080015495],[1325307600000,20.174315530051],[1327986000000,19.631084213899],[1330491600000,20.366462219462],[1333166400000,17.429019937289],[1335758400000,16.75543633539],[1338436800000,16.182906906042],[1338436800000,16.182906906042]]
},
{ key : Consumer Staples,
values : [[1138683600000,7.2800122043237],[1141102800000,7.1187787503354],[1143781200000,8.351887016482],[1146369600000,8.4156698763993],[1149048000000,8.1673298604231],[1151640000000,5.5132447126042],[1154318400000,6.1152537710599],[1156996800000,6.076765091942],[1159588800000,4.6304473798646],[1162270800000,4.6301068469402],[1164862800000,4.3466656309389],[1167541200000,6.830104897003],[1170219600000,7.241633040029],[1172638800000,7.1432372054153],[1175313600000,10.608942063374],[1177905600000,10.914964549494],[1180584000000,10.933223880565],[1183176000000,8.3457524851265],[1185854400000,8.1078413081882],[1188532800000,8.2697185922474],[1191124800000,8.4742436475968],[1193803200000,8.4994601179319],[1196398800000,8.7387319683243],[1199077200000,6.8829183612895],[1201755600000,6.984133637885],[1204261200000,7.0860136043287],[1206936000000,4.3961787956053],[1209528000000,3.8699674365231],[1212206400000,3.6928925238305],[1214798400000,6.7571718894253],[1217476800000,6.4367313362344],[1220155200000,6.4048441521454],[1222747200000,5.4643833239669],[1225425600000,5.3150786833374],[1228021200000,5.3011272612576],[1230699600000,4.1203601430809],[1233378000000,4.0881783200525],[1235797200000,4.1928665957189],[1238472000000,7.0249415663205],[1241064000000,7.006530880769],[1243742400000,6.994835633224],[1246334400000,6.1220222336254],[1249012800000,6.1177436137653],[1251691200000,6.1413396231981],[1254283200000,4.8046006145874],[1256961600000,4.6647600660544],[1259557200000,4.544865006255],[1262235600000,6.0488249316539],[1264914000000,6.3188669540206],[1267333200000,6.5873958262306],[1270008000000,6.2281189839578],[1272600000000,5.8948915746059],[1275278400000,5.5967320482214],[1277870400000,0.99784432084837],[1280548800000,1.0950794175359],[1283227200000,0.94479734407491],[1285819200000,1.222093988688],[1288497600000,1.335093106856],[1291093200000,1.3302565104985],[1293771600000,1.340824670897],[1296450000000,0],[1298869200000,0],[1301544000000,0],[1304136000000,0],[1306814400000,0],[1309406400000,0],[1312084800000,0],[1314763200000,0],[1317355200000,4.4583692315],[1320033600000,3.6493043348059],[1322629200000,3.8610064091761],[1325307600000,5.5144800685202],[1327986000000,5.1750695220792],[1330491600000,5.6710066952691],[1333166400000,8.5658461590953],[1335758400000,8.6135447714243],[1338436800000,8.0231460925212],[1338436800000,8.0231460925212]]
}, <== ติดตรงจุดนี้จุดเดียว
]]

แก้ไขล่าสุดโดย poomrin (2014-04-30 05:07:17)

6

ตอบ: ฝีก loop JavaScript

ผมคิดกลับทาง เราสามารถเช็คได้ว่า เป็นค่าแรกหรือเปล่า
ถ้าเป็นค่าแรก ก็ write ธรรมดา ไม่ต้องมีลูกน้ำ

ค่าต่อๆไป ที่ไม่ใช่ค่าแรก ก็ write ลูกน้ำออกมาก่อน ค่อย write ค่าตามปกติ

ดังนั้น ไม่ว่าตัวแปรจะมีเท่าไร ก็ไม่มีปัญหาลูกน้ำเกินครับ

7

ตอบ: ฝีก loop JavaScript

ผมลองปรับดูตามที่แนะนำแล้วครับ มีปัญหาตรงที่ loop วงนอกครับ เพราะมันต้องเริ่มจาก ไม่มีลูกน้ำก่อน ถ้าเอาลูกน้ำไว้ด้านหน้ามันก็ไม่ได้ซิครับ

document.write("data : [<br/>");
var dlength = data.length;
for(var i = 0; i < dlength; i++) {
    var d1 = 0;
    if(d1 === 0){
        document.write("{ key : " + data[i].key + ",<br/>");
        
        document.write("values : [");
        
        for(var k=0; k < data[i].values.length; k++) {
            if(k === 0){
            document.write("[" + data[i].values[k] + "]");        
            }
            else{
            document.write(",[" + data[i].values[k] + "]");
            }            
        }
        d1++;
        if(d1 > dlength){
        document.write("]<br/>}<br/>");    
        }else{
        document.write("]<br/>},<br/>");    
        }    
    }else {
        document.write("}]");
    }
}
document.write("]");

8

ตอบ: ฝีก loop JavaScript

ผมไม่ได้รันดู ตอนนี้ ได้ผลเป็นอย่างไรครับ

9

ตอบ: ฝีก loop JavaScript

คล้ายด้านบนครับแต่ไม่เบิ้ลขอมูลตัวสุดท้าย ของ values แล้วเพราะใช้ if else แทน

data : [
{ key : Consumer Discretionary,
values : [[1138683600000,27.38478809681],[1141102800000,27.371377218208],[1143781200000,26.309915460827],[1146369600000,26.425199957521],[1149048000000,26.823411519395],[1151640000000,23.850443591584],[1154318400000,23.158355444054],[1156996800000,22.998689393694],[1159588800000,27.977128511299],[1162270800000,29.073672469721],[1164862800000,28.587640408904],[1167541200000,22.788453687638],[1170219600000,22.429199073597],[1172638800000,22.324103271051],[1175313600000,17.558388444186],[1177905600000,16.769518096208],[1180584000000,16.214738201302],[1183176000000,18.729632971228],[1185854400000,18.814523318848],[1188532800000,19.789986451358],[1191124800000,17.070049054933],[1193803200000,16.121349575715],[1196398800000,15.141659430091],[1199077200000,17.175388025298],[1201755600000,17.286592443521],[1204261200000,16.323141626569],[1206936000000,19.231263773952],[1209528000000,18.446256391094],[1212206400000,17.822632399764],[1214798400000,15.539366475979],[1217476800000,15.255131790216],[1220155200000,15.660963922593],[1222747200000,13.254482273697],[1225425600000,11.920796202299],[1228021200000,12.122809090925],[1230699600000,15.691026271393],[1233378000000,14.720881635107],[1235797200000,15.387939360044],[1238472000000,13.765436672229],[1241064000000,14.6314458648],[1243742400000,14.292446536221],[1246334400000,16.170071367016],[1249012800000,15.948135554337],[1251691200000,16.612872685134],[1254283200000,18.778338719091],[1256961600000,16.75602606542],[1259557200000,19.385804443147],[1262235600000,22.950590240168],[1264914000000,23.61159018141],[1267333200000,25.708586989581],[1270008000000,26.883915999885],[1272600000000,25.893486687065],[1275278400000,24.678914263176],[1277870400000,25.937275793023],[1280548800000,29.46138169384],[1283227200000,27.357322961862],[1285819200000,29.057235285673],[1288497600000,28.549434189386],[1291093200000,28.506352379723],[1293771600000,29.449241421597],[1296450000000,25.796838168807],[1298869200000,28.740145449189],[1301544000000,22.091744141872],[1304136000000,25.079662545409],[1306814400000,23.674906973064],[1309406400000,23.41800274293],[1312084800000,23.243644138871],[1314763200000,31.591854066817],[1317355200000,31.497112374114],[1320033600000,26.672380820431],[1322629200000,27.297080015495],[1325307600000,20.174315530051],[1327986000000,19.631084213899],[1330491600000,20.366462219462],[1333166400000,17.429019937289],[1335758400000,16.75543633539],[1338436800000,16.182906906042]]
},
{ key : Consumer Staples,
values : [[1138683600000,7.2800122043237],[1141102800000,7.1187787503354],[1143781200000,8.351887016482],[1146369600000,8.4156698763993],[1149048000000,8.1673298604231],[1151640000000,5.5132447126042],[1154318400000,6.1152537710599],[1156996800000,6.076765091942],[1159588800000,4.6304473798646],[1162270800000,4.6301068469402],[1164862800000,4.3466656309389],[1167541200000,6.830104897003],[1170219600000,7.241633040029],[1172638800000,7.1432372054153],[1175313600000,10.608942063374],[1177905600000,10.914964549494],[1180584000000,10.933223880565],[1183176000000,8.3457524851265],[1185854400000,8.1078413081882],[1188532800000,8.2697185922474],[1191124800000,8.4742436475968],[1193803200000,8.4994601179319],[1196398800000,8.7387319683243],[1199077200000,6.8829183612895],[1201755600000,6.984133637885],[1204261200000,7.0860136043287],[1206936000000,4.3961787956053],[1209528000000,3.8699674365231],[1212206400000,3.6928925238305],[1214798400000,6.7571718894253],[1217476800000,6.4367313362344],[1220155200000,6.4048441521454],[1222747200000,5.4643833239669],[1225425600000,5.3150786833374],[1228021200000,5.3011272612576],[1230699600000,4.1203601430809],[1233378000000,4.0881783200525],[1235797200000,4.1928665957189],[1238472000000,7.0249415663205],[1241064000000,7.006530880769],[1243742400000,6.994835633224],[1246334400000,6.1220222336254],[1249012800000,6.1177436137653],[1251691200000,6.1413396231981],[1254283200000,4.8046006145874],[1256961600000,4.6647600660544],[1259557200000,4.544865006255],[1262235600000,6.0488249316539],[1264914000000,6.3188669540206],[1267333200000,6.5873958262306],[1270008000000,6.2281189839578],[1272600000000,5.8948915746059],[1275278400000,5.5967320482214],[1277870400000,0.99784432084837],[1280548800000,1.0950794175359],[1283227200000,0.94479734407491],[1285819200000,1.222093988688],[1288497600000,1.335093106856],[1291093200000,1.3302565104985],[1293771600000,1.340824670897],[1296450000000,0],[1298869200000,0],[1301544000000,0],[1304136000000,0],[1306814400000,0],[1309406400000,0],[1312084800000,0],[1314763200000,0],[1317355200000,4.4583692315],[1320033600000,3.6493043348059],[1322629200000,3.8610064091761],[1325307600000,5.5144800685202],[1327986000000,5.1750695220792],[1330491600000,5.6710066952691],[1333166400000,8.5658461590953],[1335758400000,8.6135447714243],[1338436800000,8.0231460925212]]
},
{ key : Energy,
values : [[1138683600000,1.544303464167],[1141102800000,1.4387289432421],[1143781200000,0],[1146369600000,0],[1149048000000,0],[1151640000000,1.328626801128],[1154318400000,1.2874050802627],[1156996800000,1.0872743105593],[1159588800000,0.96042562635813],[1162270800000,0.93139372870616],[1164862800000,0.94432167305385],[1167541200000,1.277750166208],[1170219600000,1.2204893886811],[1172638800000,1.207489123122],[1175313600000,1.2490651414113],[1177905600000,1.2593129913052],[1180584000000,1.373329808388],[1183176000000,0],[1185854400000,0],[1188532800000,0],[1191124800000,0],[1193803200000,0],[1196398800000,0],[1199077200000,0],[1201755600000,0],[1204261200000,0],[1206936000000,0],[1209528000000,0],[1212206400000,0],[1214798400000,0],[1217476800000,0],[1220155200000,0],[1222747200000,1.4516108933695],[1225425600000,1.1856025268225],[1228021200000,1.3430470355439],[1230699600000,2.2752595354509],[1233378000000,2.4031560010523],[1235797200000,2.0822430731926],[1238472000000,1.5640902826938],[1241064000000,1.5812873972356],[1243742400000,1.9462448548894],[1246334400000,2.9464870223957],[1249012800000,3.0744699383222],[1251691200000,2.9422304628446],[1254283200000,2.7503075599999],[1256961600000,2.6506701800427],[1259557200000,2.8005425319977],[1262235600000,2.6816184971185],[1264914000000,2.681206271327],[1267333200000,2.8195488011259],[1270008000000,0],[1272600000000,0],[1275278400000,0],[1277870400000,1.0687057346382],[1280548800000,1.2539400544134],[1283227200000,1.1862969445955],[1285819200000,0],[1288497600000,0],[1291093200000,0],[1293771600000,0],[1296450000000,1.941972859484],[1298869200000,2.1142247697552],[1301544000000,2.3788590206824],[1304136000000,2.5337302877545],[1306814400000,2.3163370395199],[1309406400000,2.0645451843195],[1312084800000,2.1004446672411],[1314763200000,3.6301875804303],[1317355200000,2.454204664652],[1320033600000,2.196082370894],[1322629200000,2.3358418255202],[1325307600000,0],[1327986000000,0],[1330491600000,0],[1333166400000,0.39001201038526],[1335758400000,0.30945472725559],[1338436800000,0.31062439305591]]
},
]

10

ตอบ: ฝีก loop JavaScript

เท่าที่ดูจากโค้ด ทำไมต้องสร้าง d1 ขึ้นมาด้วยครับ เพราะว่าใช้ค่า i เลยก็ได้อยู่แล้วนี่ครับ
และคุณเช็คเงื่อนไขใน loop รอบสุดท้ายผิดครับ นั่นเป็นเหตุที่ทำให้ยังมีลูกน้ำปรากฏออกมา

ผมลองปรับโค้ดคุณให้อยู่ในรูปแบบ ง่ายๆดังนี้
for ( i = 0; i < 3; i++){
document.write(i);
}

คุณคิดว่า ผลที่ได้ จะเป็นอะไร ระหว่าง
0 1 2 3
หรือ
0 1 2

แล้วลองกลับไปอ่านโค้ดของคุณดูครับ แล้วจะเข้าใจ

11

ตอบ: ฝีก loop JavaScript

กลับมาถามเกี่ยวกับเรือง function ครับ คือว่าผมอยากใส่ข้อมูล เป็น json ดังนี้

data = [
        {
        "key" : "Quantity",
        "bar": true,
        "values" : [ [ 1136005200000 , 1271000.0] , [ 1138683600000 , 1271000.0] , [ 1141102800000 , 1271000.0]
        }

ในส่วนของ Values จะต้องทำ function ยังไงถึงเวลาใส่จะได้เป็นแบบ array แบบนี้

[ 1136005200000 , 1271000.0]

อันนี้ผมลองคิดๆ ดูนะครับไม่รู้ว่าถูกไหม

function getQty (qty) {
var d = Date().getTime();
var timeline = [];
var getqty = $("#quantity").val();
var tm = timeline.push(d);
if(tm){
timeline.push(qty);
}
return tm;
$("#quantity").val("");
}

12

ตอบ: ฝีก loop JavaScript

น่าจะเกิด bug ได้นะครับ
แนะนำให้แก้

if(tm){

เขียนให้ถูกต้องและชัดเจน รัดกุมกว่านี้ครับ

และตรงนี้

return tm;

ถ้าเขียนแบบนี้
ตรงนี้ก็จะไม่มีโอกาสได้ทำงานครับ

$("#quantity").val("");

เพราะ exit ไปติดตั้งแต่ return แล้ว

ส่วนตามโจทย์ที่ถาม อันนี้ตอบไม่ได้ เพราะว่าข้อมูลไม่เพียงพอ เพราะผมไม่รู้ว่า index แรก มาจากไหน  index สองมาจากไหน ค่าแต่ละ index จะเป็นอะไรได้บ้าง ทำให้ไม่สามารถเขียนเงื่อนไขที่ครอบคลุมได้ครับ

13

ตอบ: ฝีก loop JavaScript

คือผมต้องการ input form ที่ต้องการให้ดึงข้อมูลแล้วได้รูปเป็น json อย่างด้านบน เพื่อจะเอาไปทำ chart ครับ (มันเป็นรูปแบบบังคับเพื่อเอาค่าไปพอร์ตกราฟ)
ก็เลยคิดว่าต้องสร้าง function มาอันนึงเพื่อจะใส่ค่า ให้มัน return ค่าออกมาเป็น Array แบบนั้น แล้วเอาไป push กับ key "values" อีกที

14

ตอบ: ฝีก loop JavaScript

มันเป็น format ที่แปลกมาก จะเป็น json ก็ไม่ใช่ซะทีเดียว จะเป็น array ก็ไม่ใช่อีก
เพราะถ้าเป็น json ใช้ function แปลงจาก array ทีเดียวจบเลย

var myJsonString = JSON.stringify(yourArray);

ส่วนคำถามก็ยังตอบไม่ได้อยู่ดี เพราะผมไม่รู้ input , range ของข้อมูล input, แต่ละค่ามาจากไหน

บางทีการต่อ string อาจจะเป็น solution ที่ง่ายกว่านะครับ

15

ตอบ: ฝีก loop JavaScript

ผมทำแบบนี้แล้ว work ครับ สำหรับการใส่ค่าลงใน array ย่อย ส่วนเรื่องการลูปผมทำได้แล้วละครับ

function map(mykey,myval){
var mykey = parseInt($("#mykey").val());
var myval = parseFloat($("#myval").val());
var myall = [];

    if(( _.isNumber(mykey)) && (! _.isNaN(mykey)) && ( _.isNumber(myval)) && (! _.isNaN(myval))) {
        myall.push(mykey);
            if(! _.isEmpty(myall)){
                myall.push(myval);
            }
            return myall;
        } else {
        console.log("Invaid key : " + mykey + "value : "+ myval);
    }
} 

$( "#submit" ).click(function() {
  console.log(map(mykey,myval));
  $("#mykey").val("");
  $("#myval").val("");
  $("#mykey").focus();
});

แก้ไขล่าสุดโดย poomrin (2014-05-14 03:29:59)

16

ตอบ: ฝีก loop JavaScript

สอบถามอีกเรื่องครับ คือผมอยากใส่วันที่เองด้วยมือ แต่ไม่รู้จะทำยังไงครับ แล้วอยากใส่ ประมาณนี้ครับ

$("#mykey").val().getTime()

เพื่อให้ได้ค่าออกมาเป็น milliseconds นะครับ หรือว่าทำแบบ dialog box ได้ไหมครับ

17

ตอบ: ฝีก loop JavaScript

ผมลองทำมั่วๆ ดูนะครับได้ประมาณนี้

$("#yyyy").focus();

var year = 1970;
var till = 2014;
var options = "";
for(var y=year; y<=till; y++){
  options += "<option>"+ y +"</option>";
}
document.getElementById("yyyy").innerHTML = options; 

var month = 1;
var mtill = 12;
var options = "";
for(var m=month; m<=mtill; m++){
  options += "<option>"+ m +"</option>";
}
document.getElementById("mm").innerHTML = options; 

var day1 = 1;
var dtill = 31;
var options = "";
for(var d=day1; d<=dtill; d++){
  options += "<option>"+ d +"</option>";
}
document.getElementById("dd").innerHTML = options; 


function map(yyyy,mm,dd,myval){

var yyyy = parseInt($("#yyyy").val());
var mm = parseInt($("#mm").val()) -1;
var dd = parseInt($("#dd").val());
var day = new Date(yyyy, mm, dd);
var mykey = day.getTime();
var myval = parseFloat($("#myval").val());
var myall = [];

    if(( _.isNumber(mykey)) && (! _.isNaN(mykey)) && ( _.isNumber(myval)) && (! _.isNaN(myval))) {
        myall.push(mykey);
            if(! _.isEmpty(myall)){
                myall.push(myval);
            }
            return myall;    
        } else {
        console.log("Invaid key : " + mykey + " value : "+ myval);
    }
}



$( "#submit" ).click(function() {
console.log(new map(yyyy,mm,dd,myval));
  $("#yyyy").val("");
  $("#mm").val("");
  $("#dd").val("");
  $("#myval").val("");
  $("#yyyy").focus();
});

พอผมลองใส่ค่าดู ผลออกมาเป็นแบบนี้

Thu Jan 01 1970 00:00:00 GMT-0800 (Pacific Standard Time) each.html:58
Invaid key : 28800000 value : NaN each.html:70
map {} 

แต่ว่าลองเอาเลขที่ได้เป็น mil ไปใส่ในเวป convert มันหลุดโลกไปเลยครับได้ค่าวันที่ เป็น
Date in Los Angeles*: 11/30/1970 1:00:00 AM ทำไม่เป็นแบบนี้หละครับ

18

ตอบ: ฝีก loop JavaScript

มีปัญหาเรื่องการ push data จะมาถามนะครับ ผมยังคงใช้ mongoDB เหมือนเดิม ปัญหาอยู่ที่ว่าผมได้ loop data เอาไว้ใน database เรียบร้อยแล้ว แบ่งเป็น 2 ชุดดังนี้ครับ

var qData = [{
            "key" : "Quantity",
            "bar": true,
            "values" : [ [ 1136005200000 , 1271000.0] , [ 1138683600000 , 1271000.0] , [ 1141102800000 , 1271000.0] , [ 1143781200000 , 0] , [ 1146369600000 , 0] , [ 1149048000000 , 0] , [ 1151640000000 , 0] , [ 1154318400000 , 0] , [ 1156996800000 , 0] , [ 1159588800000 , 3899486.0] , [ 1162270800000 , 3899486.0] , [ 1164862800000 , 3899486.0] , [ 1167541200000 , 3564700.0] , [ 1170219600000 , 3564700.0] , [ 1172638800000 , 3564700.0] , [ 1175313600000 , 2648493.0] , [ 1177905600000 , 2648493.0] , [ 1180584000000 , 2648493.0] , [ 1183176000000 , 2522993.0] , [ 1185854400000 , 2522993.0] , [ 1188532800000 , 2522993.0] , [ 1191124800000 , 2906501.0] , [ 1193803200000 , 2906501.0] , [ 1196398800000 , 2906501.0] , [ 1199077200000 , 2206761.0] , [ 1201755600000 , 2206761.0] , [ 1204261200000 , 2206761.0] , [ 1206936000000 , 2287726.0] , [ 1209528000000 , 2287726.0] , [ 1212206400000 , 2287726.0] , [ 1214798400000 , 2732646.0] , [ 1217476800000 , 2732646.0] , [ 1220155200000 , 2732646.0] , [ 1222747200000 , 2599196.0] , [ 1225425600000 , 2599196.0] , [ 1228021200000 , 2599196.0] , [ 1230699600000 , 1924387.0] , [ 1233378000000 , 1924387.0] , [ 1235797200000 , 1924387.0] , [ 1238472000000 , 1756311.0] , [ 1241064000000 , 1756311.0] , [ 1243742400000 , 1756311.0] , [ 1246334400000 , 1743470.0] , [ 1249012800000 , 1743470.0] , [ 1251691200000 , 1743470.0] , [ 1254283200000 , 1519010.0] , [ 1256961600000 , 1519010.0] , [ 1259557200000 , 1519010.0] , [ 1262235600000 , 1591444.0] , [ 1264914000000 , 1591444.0] , [ 1267333200000 , 1591444.0] , [ 1270008000000 , 1543784.0] , [ 1272600000000 , 1543784.0] , [ 1275278400000 , 1543784.0] , [ 1277870400000 , 1309915.0] , [ 1280548800000 , 1309915.0] , [ 1283227200000 , 1309915.0] , [ 1285819200000 , 1331875.0] , [ 1288497600000 , 1331875.0] , [ 1291093200000 , 1331875.0] , [ 1293771600000 , 1331875.0] , [ 1296450000000 , 1154695.0] , [ 1298869200000 , 1154695.0] , [ 1301544000000 , 1194025.0] , [ 1304136000000 , 1194025.0] , [ 1306814400000 , 1194025.0] , [ 1309406400000 , 1194025.0] , [ 1312084800000 , 1194025.0] , [ 1314763200000 , 1244525.0] , [ 1317355200000 , 475000.0] , [ 1320033600000 , 475000.0] , [ 1322629200000 , 475000.0] , [ 1325307600000 , 690033.0] , [ 1327986000000 , 690033.0] , [ 1330491600000 , 690033.0] , [ 1333166400000 , 514733.0] , [ 1335758400000 , 514733.0]]
          }];
          
        for(var i =0; i < qData.length; i++) {
            Quantity.insert({
                key: qData[i].key,
                bar: qData[i].bar
            });
            var id = Quantity.findOne({key: qData[i].key}).id;
            
            for(var j= 0; j < i; j++){
                Quantity.update(id, {$addToSet: {values: value}});
            }
        }
var pData = [{
            "key" : "Price",
            "values" : [ [ 1136005200000 , 71.89] , [ 1138683600000 , 75.51] , [ 1141102800000 , 68.49] , [ 1143781200000 , 62.72] , [ 1146369600000 , 70.39] , [ 1149048000000 , 59.77] , [ 1151640000000 , 57.27] , [ 1154318400000 , 67.96] , [ 1156996800000 , 67.85] , [ 1159588800000 , 76.98] , [ 1162270800000 , 81.08] , [ 1164862800000 , 91.66] , [ 1167541200000 , 84.84] , [ 1170219600000 , 85.73] , [ 1172638800000 , 84.61] , [ 1175313600000 , 92.91] , [ 1177905600000 , 99.8] , [ 1180584000000 , 121.191] , [ 1183176000000 , 122.04] , [ 1185854400000 , 131.76] , [ 1188532800000 , 138.48] , [ 1191124800000 , 153.47] , [ 1193803200000 , 189.95] , [ 1196398800000 , 182.22] , [ 1199077200000 , 198.08] , [ 1201755600000 , 135.36] , [ 1204261200000 , 125.02] , [ 1206936000000 , 143.5] , [ 1209528000000 , 173.95] , [ 1212206400000 , 188.75] , [ 1214798400000 , 167.44] , [ 1217476800000 , 158.95] , [ 1220155200000 , 169.53] , [ 1222747200000 , 113.66] , [ 1225425600000 , 107.59] , [ 1228021200000 , 92.67] , [ 1230699600000 , 85.35] , [ 1233378000000 , 90.13] , [ 1235797200000 , 89.31] , [ 1238472000000 , 105.12] , [ 1241064000000 , 125.83] , [ 1243742400000 , 135.81] , [ 1246334400000 , 142.43] , [ 1249012800000 , 163.39] , [ 1251691200000 , 168.21] , [ 1254283200000 , 185.35] , [ 1256961600000 , 188.5] , [ 1259557200000 , 199.91] , [ 1262235600000 , 210.732] , [ 1264914000000 , 192.063] , [ 1267333200000 , 204.62] , [ 1270008000000 , 235.0] , [ 1272600000000 , 261.09] , [ 1275278400000 , 256.88] , [ 1277870400000 , 251.53] , [ 1280548800000 , 257.25] , [ 1283227200000 , 243.1] , [ 1285819200000 , 283.75] , [ 1288497600000 , 300.98] , [ 1291093200000 , 311.15] , [ 1293771600000 , 322.56] , [ 1296450000000 , 339.32] , [ 1298869200000 , 353.21] , [ 1301544000000 , 348.5075] , [ 1304136000000 , 350.13] , [ 1306814400000 , 347.83] , [ 1309406400000 , 335.67] , [ 1312084800000 , 390.48] , [ 1314763200000 , 384.83] , [ 1317355200000 , 381.32] , [ 1320033600000 , 404.78] , [ 1322629200000 , 382.2] , [ 1325307600000 , 405.0] , [ 1327986000000 , 456.48] , [ 1330491600000 , 542.44] , [ 1333166400000 , 599.55] , [ 1335758400000 , 583.98]]
          }];
    
        _.each(pData, function(item) {
          var id = Price.insert({key: item.key});
          _.each(item.values, function(value) {
            Price.update(id, {$addToSet: {values: value}});
          });
        });

แล้่วผมอยากให้มัน join กันเป็นอันเดียวแบบนี้ครับ

var data = [{
            "key" : "Quantity",
            "bar": true,
            "values" : [ [ 1136005200000 , 1271000.0] , [ 1138683600000 , 1271000.0] , [ 1141102800000 , 1271000.0] , [ 1143781200000 , 0] , [ 1146369600000 , 0] , [ 1149048000000 , 0] , [ 1151640000000 , 0] , [ 1154318400000 , 0] , [ 1156996800000 , 0] , [ 1159588800000 , 3899486.0] , [ 1162270800000 , 3899486.0] , [ 1164862800000 , 3899486.0] , [ 1167541200000 , 3564700.0] , [ 1170219600000 , 3564700.0] , [ 1172638800000 , 3564700.0] , [ 1175313600000 , 2648493.0] , [ 1177905600000 , 2648493.0] , [ 1180584000000 , 2648493.0] , [ 1183176000000 , 2522993.0] , [ 1185854400000 , 2522993.0] , [ 1188532800000 , 2522993.0] , [ 1191124800000 , 2906501.0] , [ 1193803200000 , 2906501.0] , [ 1196398800000 , 2906501.0] , [ 1199077200000 , 2206761.0] , [ 1201755600000 , 2206761.0] , [ 1204261200000 , 2206761.0] , [ 1206936000000 , 2287726.0] , [ 1209528000000 , 2287726.0] , [ 1212206400000 , 2287726.0] , [ 1214798400000 , 2732646.0] , [ 1217476800000 , 2732646.0] , [ 1220155200000 , 2732646.0] , [ 1222747200000 , 2599196.0] , [ 1225425600000 , 2599196.0] , [ 1228021200000 , 2599196.0] , [ 1230699600000 , 1924387.0] , [ 1233378000000 , 1924387.0] , [ 1235797200000 , 1924387.0] , [ 1238472000000 , 1756311.0] , [ 1241064000000 , 1756311.0] , [ 1243742400000 , 1756311.0] , [ 1246334400000 , 1743470.0] , [ 1249012800000 , 1743470.0] , [ 1251691200000 , 1743470.0] , [ 1254283200000 , 1519010.0] , [ 1256961600000 , 1519010.0] , [ 1259557200000 , 1519010.0] , [ 1262235600000 , 1591444.0] , [ 1264914000000 , 1591444.0] , [ 1267333200000 , 1591444.0] , [ 1270008000000 , 1543784.0] , [ 1272600000000 , 1543784.0] , [ 1275278400000 , 1543784.0] , [ 1277870400000 , 1309915.0] , [ 1280548800000 , 1309915.0] , [ 1283227200000 , 1309915.0] , [ 1285819200000 , 1331875.0] , [ 1288497600000 , 1331875.0] , [ 1291093200000 , 1331875.0] , [ 1293771600000 , 1331875.0] , [ 1296450000000 , 1154695.0] , [ 1298869200000 , 1154695.0] , [ 1301544000000 , 1194025.0] , [ 1304136000000 , 1194025.0] , [ 1306814400000 , 1194025.0] , [ 1309406400000 , 1194025.0] , [ 1312084800000 , 1194025.0] , [ 1314763200000 , 1244525.0] , [ 1317355200000 , 475000.0] , [ 1320033600000 , 475000.0] , [ 1322629200000 , 475000.0] , [ 1325307600000 , 690033.0] , [ 1327986000000 , 690033.0] , [ 1330491600000 , 690033.0] , [ 1333166400000 , 514733.0] , [ 1335758400000 , 514733.0]]
          },
          {
            "key" : "Price",
            "values" : [ [ 1136005200000 , 71.89] , [ 1138683600000 , 75.51] , [ 1141102800000 , 68.49] , [ 1143781200000 , 62.72] , [ 1146369600000 , 70.39] , [ 1149048000000 , 59.77] , [ 1151640000000 , 57.27] , [ 1154318400000 , 67.96] , [ 1156996800000 , 67.85] , [ 1159588800000 , 76.98] , [ 1162270800000 , 81.08] , [ 1164862800000 , 91.66] , [ 1167541200000 , 84.84] , [ 1170219600000 , 85.73] , [ 1172638800000 , 84.61] , [ 1175313600000 , 92.91] , [ 1177905600000 , 99.8] , [ 1180584000000 , 121.191] , [ 1183176000000 , 122.04] , [ 1185854400000 , 131.76] , [ 1188532800000 , 138.48] , [ 1191124800000 , 153.47] , [ 1193803200000 , 189.95] , [ 1196398800000 , 182.22] , [ 1199077200000 , 198.08] , [ 1201755600000 , 135.36] , [ 1204261200000 , 125.02] , [ 1206936000000 , 143.5] , [ 1209528000000 , 173.95] , [ 1212206400000 , 188.75] , [ 1214798400000 , 167.44] , [ 1217476800000 , 158.95] , [ 1220155200000 , 169.53] , [ 1222747200000 , 113.66] , [ 1225425600000 , 107.59] , [ 1228021200000 , 92.67] , [ 1230699600000 , 85.35] , [ 1233378000000 , 90.13] , [ 1235797200000 , 89.31] , [ 1238472000000 , 105.12] , [ 1241064000000 , 125.83] , [ 1243742400000 , 135.81] , [ 1246334400000 , 142.43] , [ 1249012800000 , 163.39] , [ 1251691200000 , 168.21] , [ 1254283200000 , 185.35] , [ 1256961600000 , 188.5] , [ 1259557200000 , 199.91] , [ 1262235600000 , 210.732] , [ 1264914000000 , 192.063] , [ 1267333200000 , 204.62] , [ 1270008000000 , 235.0] , [ 1272600000000 , 261.09] , [ 1275278400000 , 256.88] , [ 1277870400000 , 251.53] , [ 1280548800000 , 257.25] , [ 1283227200000 , 243.1] , [ 1285819200000 , 283.75] , [ 1288497600000 , 300.98] , [ 1291093200000 , 311.15] , [ 1293771600000 , 322.56] , [ 1296450000000 , 339.32] , [ 1298869200000 , 353.21] , [ 1301544000000 , 348.5075] , [ 1304136000000 , 350.13] , [ 1306814400000 , 347.83] , [ 1309406400000 , 335.67] , [ 1312084800000 , 390.48] , [ 1314763200000 , 384.83] , [ 1317355200000 , 381.32] , [ 1320033600000 , 404.78] , [ 1322629200000 , 382.2] , [ 1325307600000 , 405.0] , [ 1327986000000 , 456.48] , [ 1330491600000 , 542.44] , [ 1333166400000 , 599.55] , [ 1335758400000 , 583.98]]
          }];

ผมไม่รู้ว่าต้องทำยังไง เพราะว่า .push แล้วมันก็ไม่ได้ ไม่แน่ใจว่าติด ครอบ Array ของ price หรือว่าติดตรง _id ที่ได้จาก mongoDB กันแน่นะครับ

19

ตอบ: ฝีก loop JavaScript

http://help.dottoro.com/ljnkadsn.php ลองดูหัวข้อ "Creating a multidimensional array (array of arrays):"

บางทีเราก็ไม่ต้องคิดอะไรให้มันยากเกินไปครับ

20

ตอบ: ฝีก loop JavaScript

ผมมีปัญหาอยากถามครับ คืออยากได้จำนวนรวมที่ถูกโหวตไปแล้วของคนที่กำลัง login อยู่ว่ามีการโหวตเอาไว้กี่ครั้งแล้ว เพราะจะจำกัดจำนวนการโหวตทั้งหมด เช่น จะต้องโหวตได้ไม่เกิน 4 ครั้ง จากทั้งหมด 10 ข้อ แบบนี้นะครับ (จากตัวอย่างมันมีค่าอยู่หลายๆ Object ครับ อันนี้ก็อปปี้มากจาก Google Chrome Console)

{_id: "SEg6Fx7SF2yago3QQ"
questionText: "Good testing."
submittedBy: "7Kbo6QdAFnbgyoeup"
submittedOn: Tue Jun 10 2014 13:44:51 GMT-0700 (Pacific Daylight Time)
voter: Array[1]
0: "7HTvpWdYhBhXHsv2F"}

21

ตอบ: ฝีก loop JavaScript

ก็สร้าง field ตัวหนึ่งให้คนนั้นแล้วทำเป็นตัว count เลยครับ เมื่อมีการ vote ก็ count เพิ่ม ง่ายและเร็วสุดครับ

22

ตอบ: ฝีก loop JavaScript

ตอนแรกผมก็ลังเลอยู่เหมือนกันครับ ว่าจะเอาแบบนั้นดีไหมนะ แต่ว่าผมลองใช้ framework ชื่อ Meteor อยู่ครับ
ก็เลยลองหาวิธีดู แต่ว่าจริงๆ ผมก็อยากเข้าใจวิธีการลูบเพื่อหาค่ามากกว่าจะได้เข้าใจอะไรมากขึ้น วิธีของผมก็ใช้ function ที่เค้าให้มาเลยครับ คือ กรองค่าด้วย userId จากใน collection แล้วเอามา count เพราะว่าตอนที่ผมให้กดโหวตจะให้ใส่ userId ลงไปใน array field ตัวนึงแบบห้ามซ้ำ id ในนั้น แล้วก็กรองออกมาเลยว่ามีกี่ record ที่มีไอดีตรงกับคนที่ login

var limit = 3;    
var data = Questions.find({voter: {$in:[Meteor.userId()]}}).count();
var result = limit - data;
return    result;

แก้ไขล่าสุดโดย poomrin (2014-06-13 01:23:00)

23

ตอบ: ฝีก loop JavaScript

สอบถามเรืองพฤติกรรมของ javascript หน่อยครับ เคยลองดูรู้สึกว่า javascript จะมองทุกอย่างเป็น string หมดเลย แต่ผมอยากตรวจสอบ invalid data ก่อนว่าเป็น Number รึเปล่า โดยเขียนเป็น function ครับ แต่ลองแล้วไม่ work ครับ ช่วยดูให้หน่อย

var options1 = function(fName,lName,phoneNumber,add1,city,state,zipCode){
    var fName = $("#fName").val();
    var lName = $("#lName").val();
    var phoneNumber = $("#phoneNumber").val();
    var add1 = $("#add1").val();
    var city = $("#city").val();
    var state = $("#state").val();
    var zipCode = $("#zipCode").val();
    var phoneNumberConvert = function (phoneNumber) {
        if(parseInt(phoneNumber) !== NaN){
            return phoneNumber;
        }else {
            Session.set("status", "Invalid Number");
        }
    }
    
    var zipCodeConvert = function (zipCode) {
        if(parseInt(zipCode) !== NaN){
            return zipCode;
        }else {
            Session.set("status2", "Invalid Number");
        }
    }
    
    console.log(phoneNumberConvert + zipCodeConvert );
                            
    if(_.isString(fName) && !_.isEmpty(fName) && _.isString(lName) && !_.isEmpty(lName) && _.isString(add1) && !_.isEmpty(add1) && _.isString(city) && !_.isEmpty(city) && _.isString(state) && !_.isEmpty(state) && _.isNumber(phoneNumberConvert) && !_.isEmpty(phoneNumberConvert) &&  _.isNumber(zipCodeConvert) && !_.isEmpty(zipCodeConvert)){
        var result = {
                        fName: fName,
                        lName: lName,
                        phoneNumber: phoneNumberConvert,
                        add1: add1,
                        city: city,
                        state: state,
                        zipCode: zipCodeConvert
                    };
        return result;
        console.log(result);
    }else{
        console.log("Invalid input");
    }
}

24

ตอบ: ฝีก loop JavaScript

หลักการใช้ javascript ที่ดี เวลารับค่า หรือเวลาสร้างตัวแปลใหม่ ให้แปลงมาอยู่ใน format ที่เราต้องการจริงๆ แล้วเวลาจะทำงานก็จะได้ไม่งงครับ

เพราะถ้าเรามั่นใจว่า ตอนรับค่ากับตอนที่สร้างตัวใหม่ใหม่ เราได้กำหนดให้อยู่ใน format ที่ถูกต้องแล้ว เราจะไม่ต้องเสียเวลา validate ก่อนใช้ครับ โค้ดจะสะอาดขึ้นด้วยครับ

25

ตอบ: ฝีก loop JavaScript

หลังจากที่ผมห่างหายไปนานเพราะไปหัดอ่านหนังสือภาษาอังกฤษอยู่ครับ ตอนนี้เกิดสงสัยเรื่องของ การเขียน function ว่าจะเอาตัวแปรไว้ส่วนไหนดี

var arrangeOptions = function(inA1,cbA1) {
        
    if(!_.isEmpty(inA1) && !_.isEmpty(cbA1) && _.isString(cbA1)){
        var inA1 = $("#inA1").val();
        var cbA1 = $("#cbA1").val();
            if(!_.isNaN(phaseInt(inA1,2))){    
                var resultObject = {value: inA1, checkbox: cbA1};
                return resultObject;
            }else{
                return "Inbox:inA1 is not Number.";
            }
    }else {
        return "Please input numbers in any field.";
    }
}

ผมเขียนแบบนี้แล้วมันไม่ผ่านนะครับ ทั้งๆ ที่ input ถูกแล้ว ผลที่ได้ใน console.log คือ return "Please input numbers in any field.";