のくす牧場
コンテンツ
牧場内検索
カウンタ
総計:127,432,681人
昨日:no data人
今日:
最近の注目
人気の最安値情報

私的良スレ書庫

不明な単語は2ch用語を / 要望・削除依頼は掲示板へ。不適切な画像報告もこちらへどうぞ。 / 管理情報はtwitter
ログインするとレス評価できます。 登録ユーザには一部の画像が表示されますので、問題のある画像や記述を含むレスに「禁」ボタンを押してください。

元スレ+ JavaScript & jQuery 質問用スレッド vol.5 +

JavaScript スレッド一覧へ / JavaScript とは? / 携帯版 / dat(gz)で取得 / トップメニュー
スレッド評価: スレッド評価について
みんなの評価 :
タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。
レスフィルター : (試験中)
←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitter
801 : Name_Not - 2016/06/05(日) 04:20:37.43 ID:???.net (+62,+29,-113)
手続き型プログラミングとしてはこれ以上は減らしようがない気がする
関数型プログラミングに変えれば、多少は変わるけど、所詮はコーディングスタイルの違いで明確な優劣はない
for文はforEachよりも速く、forEachは関数スコープで区切ることが出来るぐらいか
for文でもlet文を使えばスコープを区切ることが可能だけど
802 : Name_Not - 2016/06/05(日) 04:53:23.06 ID:???.net (-1,-29,-31)
removeScheculeCells (笑)
803 : Name_Not - 2016/06/05(日) 04:54:13.22 ID:???.net (+107,+29,-48)
>>800
> ライブラリがあれば短くかけるのは当然としてライブラリを使わないから冗長で無駄ってのは子のスレでしか聞かないなー

元のレスにjQuery使ってって書いてあるのに、使わないで冗長に書くっていうのは
目的を果たしていない上に無駄でしか無いなw
804 : Name_Not - 2016/06/05(日) 04:58:13.64 ID:???.net (+72,+30,+0)
805 : Name_Not - 2016/06/05(日) 05:09:51.80 ID:???.net (-1,-29,-35)
汎用性を求めるとrows,cellsを使うことになるよね
特に複合型はindexで参照できないといろいろ面倒
806 : Name_Not - 2016/06/05(日) 05:48:41.60 ID:???.net (+3,-29,-144)
とりあえず中間のつもりだけど、これ以上やっても
あまり良くならないのでこれで最後にするかも。
http://jsfiddle.net/eoxzjqwu/14/

for文の中で無意味にやっていた変数の宣言の排除
多すぎて分かりづらい変数の削除
処理の改善(++k して --k するのにはワロタw)
jQuery化
 jQueryのremove()への置き換えと不要になったremove()の削除
 即時関数なくしてインデントを下げる
79行 => 56行(不自然な行減らしはしてないつもり)

などを行った。
807 : Name_Not - 2016/06/05(日) 05:50:27.06 ID:???.net (+76,-29,-14)
あと ++v から v++ に変更(笑)

C++を知らんのか?
普通は変数の後ろに++やで?
808 : Name_Not - 2016/06/05(日) 06:13:36.37 ID:???.net (+35,-30,-161)
一応、案だけ書いておくか。

colSpanの設定は、attr('colspan', function() {・・・}) あたりを使えば
1~2行減らせるんじゃないかと思ってる。rowSpanも同じく。

そしてrowSpanの方は、インデックス(i, j)を使ってforでぐるぐる回すんじゃなくて
セレクタtd:nth-childを使って縦のcellを取ってくれば、
colspanとほぼ同じコードで良くなって、3行程減らせるんじゃないかと思ってる。

もしこれによってcolspanとrowspanのコードを共通化できれば半分になるから
40行程度まで減らせるかもしれない。
809 : Name_Not - 2016/06/05(日) 06:38:27.63 ID:???.net (+60,+22,-43)
やばいw 理屈の上ではcolspanとrowspanのコードは同じでいいはずだよなぁ
ぐらいの感覚で>>808書いて、なんも考えずにコピペして適当に置き換えたら動いたw
これ本当に共通化できるよ。

http://jsfiddle.net/eoxzjqwu/16/
810 : Name_Not - 2016/06/05(日) 07:27:25.43 ID:???.net (+7,-25,-10)
ここまでかな。
http://jsfiddle.net/eoxzjqwu/22/

attrを使う案はうまく行かなかった。
あとせっかく減らしたインデントが共通関数のために深くなってしまった。残念。
最終的に 79行 => 42行
811 : Name_Not - 2016/06/05(日) 08:54:15.98 ID:???.net (+61,+28,-60)
せっかくの減らしたインデントがまた深くなったのが悔しいので
jQueryプラグインにしたよw

行数も39行まで減った(無理やり空行削れば34行)
http://jsfiddle.net/eoxzjqwu/29/
812 : Name_Not - 2016/06/05(日) 11:20:35.68 ID:???.net (+116,+29,-26)
>>790はパフォーマンス寄りにチューンしてる感じ
いかにも手続き型言語らしい書き方だな
813 : Name_Not - 2016/06/05(日) 12:19:55.85 ID:???.net (+62,+29,-10)
>>807
> 普通は変数の後ろに++やで?
何その固定観念
君はもう少し、頭を柔らかくした方がいいよ
814 : Name_Not - 2016/06/05(日) 12:46:22.22 ID:???.net (+62,+29,-29)
C++の名前から後置インクリメントがベターと記憶したのか
深く考えずに定型コードをそのまま使うタイプだな
815 : Name_Not - 2016/06/05(日) 13:46:06.12 ID:???.net (-2,-30,-64)
while (i++ < length - 1)
while (++i < length)
どっちでもいいとおもう
816 : Name_Not - 2016/06/05(日) 14:24:30.54 ID:???.net (+57,+29,-17)
俺も基本的に後++だなぁ
もちろん使い分けるけど
817 : Name_Not - 2016/06/05(日) 14:45:37.25 ID:???.net (+118,+29,-21)
>>812
> >>790はパフォーマンス寄りにチューンしてる感じ
可読性を落としてまでやることじゃない。
818 : Name_Not - 2016/06/05(日) 14:49:35.61 ID:???.net (+30,-29,+0)
>>814
深く考えたら、++i なんてしねーよw
819 : Name_Not - 2016/06/05(日) 14:53:45.56 ID:???.net (+5,-29,-15)
>>798
> for文の中でvar宣言すると多重定義になるからそうしてるんだろう
JavaScriptで変数の多重定義は違反にはならない。
820 : Name_Not - 2016/06/05(日) 14:56:38.27 ID:???.net (+64,+0,-37)
そもそもfor文内で宣言した変数はその1ループごとに破棄されるから多重扱いですらないのでは
821 : Name_Not - 2016/06/05(日) 15:23:15.97 ID:???.net (+71,+30,-151)
>>820
まあ何のために、一行を長くして可読性を下げてまで
for内でやらなくていい変数定義をしたのか理由がわからんね。
深く考えてないんだろうけどw

そもそも元のコードは変数多すぎ。
それに縦と横でアルゴリズムが大きく変わるはずがないことに
気づかなかったのかねぇ。おかげで2倍のコードを読む羽目になった。

アルゴリズム上、これlengthっていらなくね?って思ったらやっぱりそうだった。
元のコードは縦のcellリストを作らずにループでやってたから終了条件として必要だったんだろうな。
http://jsfiddle.net/eoxzjqwu/30/
無駄なコードを削って37行に。気づけば元のコードの半分以下になってるな。
修正後のvarで定義している変数の数はたった3つ。
822 : Name_Not - 2016/06/05(日) 15:49:56.06 ID:???.net (+72,+29,-9)
>>772

770だよ

俺は初見だ!
なんの議論にも加わってねーよ!www
823 : Name_Not - 2016/06/05(日) 16:26:16.15 ID:???.net (+11,-21,-65)
さらに、縦と横のコードを両方共セレクタに置き換えることで
汎用化してblock呼び出しも削った。
http://jsfiddle.net/eoxzjqwu/35/ (30行)

分割代入とか使えば、もう少し可読性上がるけど
IEで動かないのであえて使ってないw
824 : Name_Not - 2016/06/05(日) 16:57:49.10 ID:???.net (+41,+9,-14)
>>818
評価値を使わないならどちらでも変わらない
825 : Name_Not - 2016/06/05(日) 17:01:20.46 ID:???.net (+107,+29,-23)
>>817
お前がおまえのコードを書く分には好きにすればいい
他人のコードにケチをつけるほどの理由はない
826 : Name_Not - 2016/06/05(日) 17:03:51.01 ID:???.net (+108,+29,-11)
>>825
コードレビューっていうのは、コードにケチを付けることだよw
人格批判じゃないんだから気にすんなよw
827 : Name_Not - 2016/06/05(日) 17:19:24.13 ID:???.net (+246,+29,-7)
動いてはいるのだけど、明らかに無駄な処理過ぎるので突っ込まれる前に直した。
http://jsfiddle.net/eoxzjqwu/36/
828 : Name_Not - 2016/06/05(日) 17:32:18.11 ID:???.net (+111,+30,-43)
>>826
「一長一短」という言葉があってだな
おまえの中の優先順位と他人の優先順位が同じとは限らない
更にいえば、「おまえの中では可読性が低い」というだけ
手続き型プログラミングとしてはあのぐらいは当たり前にある
829 : Name_Not - 2016/06/05(日) 17:38:29.13 ID:???.net (+57,+29,-8)
えとな、これはJavaScriptだ。

言ってる意味わかるか?
830 : Name_Not - 2016/06/05(日) 17:39:13.44 ID:???.net (-1,-29,-26)
COBOLではあのぐらい当たり前にあるっていう理由で
JavaScriptでCOBOL風の可読性の低い書き方をされたら
たまったもんじゃないなw
831 : Name_Not - 2016/06/05(日) 17:46:26.73 ID:???.net (+78,-30,-70)
>>819
知ってるけど、多重定義を避けたい気持ちは理解できる

while (i--) {
var obj = array[i];
console.log(obj.a, obj.b);
}

このコードの var obj の行がとても気持ち悪い
これは感覚であって理屈じゃないんだよね
まあ、変数の代入に先行して初期化処理があるべき、といえなくもないけど
832 : Name_Not - 2016/06/05(日) 17:50:38.89 ID:???.net (+38,-29,-49)
>>831
varで書いてメリットは、あとでletに置き換えやすいということ。

コードには、そうする意図があるわけで、
その位置にvarを書いておけば、whileの外では使わないものである
という意図が明確になる。たとえ使えたとしてもだ。
833 : Name_Not - 2016/06/05(日) 18:01:05.58 ID:???.net (+109,+29,-20)
>>831
いやそれって多重定義にならんよな?
てか何言語出身よ?
Cならそれ普通だし、JavaScriptならそれ以前だし。
834 : Name_Not - 2016/06/05(日) 18:04:14.68 ID:???.net (+52,+29,-3)
はい、自己満足で解決
835 : Name_Not - 2016/06/05(日) 18:12:39.85 ID:???.net (+72,+29,-17)
>>828
それで、おまえの中の優先順位ってなんだよw

優先順位を満たしていると言う根拠も示せず
あとづけで言っても説得力ねーぞ?
836 : Name_Not - 2016/06/05(日) 18:20:36.69 ID:???.net (+50,-9,-1)
732氏は凄いなあ
837 : Name_Not - 2016/06/05(日) 18:44:46.46 ID:???.net (+103,+30,-169)
>>836

>>732はできるかな?って思ってやってみただけだけどね。
処理的には属性つけて更新して削除してとかやってるからなんか無駄だし、
縦にはそのままでは対応できない。頑張ってもあの程度の量で出来るかどうかわからない。
>>827が思いの外シンプルに修正できたので、通常はこっちをおすすめする。

それはそれとして、こういうのに挑戦すると楽しいし技術力も上がるよ。
人によっては動けばいいが最優先になってる人もいるけど、
そういう人のコードは無駄が多いし、いつもその程度でやめるてるから技術力はあがらない。
JavaScript使っていても過去にやってた手続き型風の書き方のままになっちゃう。
動けばいいでやめるからそうなるわけ。

時間をかけて最初に書いたものをそれ以上に修正していくことで
次からはそれを最初からかけるようになるよ。
面白いネタを持ってきてくれた人に感謝だなw
838 : Name_Not - 2016/06/05(日) 20:14:17.43 ID:???.net (+143,+29,-60)
>>790は面目丸つぶれw

>http://jsfiddle.net/eoxzjqwu/
>
> 件の人が「コードが長すぎて冗長だ」と煽り立てるのが目に浮かぶが、「簡潔で美しいコード」はコード量が少ないことを指すわけではない。
> >>732のようなアルゴリズム上の無駄を美しくないと感じる人もいる。


>>732>>790を修正したコード

http://jsfiddle.net/eoxzjqwu/36/
839 : Name_Not - 2016/06/05(日) 22:28:52.63 ID:???.net (+93,+29,-12)
>>832
そうだね
>>790はletに置き換える事を意識している気配がある

>>833
仕様上、それが問題ない事は分かってるよ
840 : Name_Not - 2016/06/05(日) 22:35:39.12 ID:???.net (+64,-30,+0)
>>839
>>790はletに置き換える事を意識している気配がある

話の流れ無視すんなーw

> for (var k = 0, cells = rows[j].cells, n = cells.length, cell, textContent, colSpan, nextCell; k < n; ++k) {
> cell = cells[k];
> textContent = cell.textContent;
> colSpan = cell.colSpan;

例えばこことか、forの行でcells.lengthをnに入れるのはまだわかるが、

そのすぐ下の行で代入してる、cell、textContent、colSpanなんかを
forの行でやる意味がない。

for (var k = 0, n = cells.length; k < n; ++k) {
var cell = cells[k];
var textContent = cell.textContent;
var colSpan = cell.colSpan;

↑こう書けばいいだろ。
varの動作からしたら、適切じゃないかもしれないが、
意図としてはこのとおりなんだし、あとからletに置き換えやすい。

という流れだろうがw
841 : Name_Not - 2016/06/05(日) 22:36:32.86 ID:???.net (-1,-29,-14)
伝わってない人もいるようなので書くと、こんなコードね

var a = 1;
var a = 2;

仕様上は問題ないけど、2回目はvar宣言を外したい
842 : Name_Not - 2016/06/05(日) 22:40:30.11 ID:???.net (+2,-29,-26)
> 仕様上は問題ないけど、2回目はvar宣言を外したい

いや、forの行でvarしても中でvarしても
変数に対するvarは一回だけですが?

2回目ってどこのことですかね?
843 : Name_Not - 2016/06/05(日) 22:41:46.02 ID:???.net (+32,-29,-9)
>>842
k === 1 になった時
844 : Name_Not - 2016/06/05(日) 22:42:33.49 ID:???.net (+74,+29,-9)
>>843
行番号言ってくれない?

別々の行番号を2つ言えるはずだよね?
845 : Name_Not - 2016/06/05(日) 22:46:02.84 ID:???.net (+69,-30,-79)
関数で考えればわかるはずなんだが、

↓ このコードは実行できる。

foo();
function foo() { ・・・ }

foo()を実行する段階では、まだfunction foo() {}は実行されてないじゃないか!?って
思う人はいないだろう。

理由は簡単で、実行時じゃなくてパースした後にfunction foo()は定義されるから。
それと同じで、var a も、var aと書いた所でvarされるのではなくて、
パースした後に定義されるんだけどな。

ループで繰り返すたびに、varするわけじゃないんだよw
もちろん代入自体は行われるけどね。
846 : Name_Not - 2016/06/05(日) 22:48:21.28 ID:???.net (+59,-13,-7)
>>844
行番号は変わらない
>>840の2,3,4行目を展開すればそうなる
847 : Name_Not - 2016/06/05(日) 22:49:00.63 ID:???.net (+52,+22,+1)
>>846

>>845を読んでねw
848 : Name_Not - 2016/06/05(日) 22:51:57.89 ID:???.net (+78,+29,-80)
>>845
だから、それは理解してる
変数は関数呼び出しされた時点でundefinedで初期化される
わかってるけど、コードをそのまま読むと変数を再宣言しているように見えてしまうんだよ
letならブロックスコープ単位で初期化されるから再宣言はしないね
何度もいうけど、感覚の話だから
849 : Name_Not - 2016/06/05(日) 22:52:38.05 ID:???.net (+117,-30,-294)
>>846
> >>840の2,3,4行目を展開すればそうなる
JavaScriptを勉強しようぜw

 function setColSpan (tableSection /* [... tableSection] */) {
   省略
   for (var k = 0, n = cells.length; k < n; ++k) {
     var cell = cells[k];
     var textContent = cell.textContent;
     var colSpan = cell.colSpan;

っていうのは変数の巻き上げって処理が行われて、こう解釈されるんだぜ

 function setColSpan (tableSection /* [... tableSection] */) {
   var k, n, cell, textContent, colSpan;
   省略
   for (k = 0, n = cells.length; k < n; ++k) {
     cell = cells[k];
     textContent = cell.textContent;
     colSpan = cell.colSpan;

この後で展開した所で、varは2回でてくることはない。
850 : Name_Not - 2016/06/05(日) 22:53:56.34 ID:???.net (+68,+29,-5)
>>831
お前はJavascriptだけじゃなくプログラムを学び直すべき
←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / JavaScript スレッド一覧へ
スレッド評価: スレッド評価について
みんなの評価 :
タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

類似してるかもしれないスレッド


トップメニューへ / →のくす牧場書庫について