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

    元スレ+ JavaScript の質問用スレッド vol.131 +

    JavaScript覧 / PC版 /
    スレッド評価: スレッド評価について
    みんなの評価 :
    タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。
    ←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitter

    151 = :

    >>150
    sort してから反復するとか

    let a = [‘りんご’, … ];
    a.sort();

    let max = -1, // 最大出現回数
    let count = 0, // 現在の単語の出現回数
    let word, // 出現回数最大の単語

    a.reduce(f);

    function f(前, 次){
    if(前 === 次){
    count +=1
    } else {
    if( max < count ) { max = count; word = 前 }
    count = 0;
    }

    みたいな感じ(細かい所は省略

    152 = :

    >>151
    すまん、 reduce の使い方がダメダメだったので取り消す

    153 = :

    var fruitsArray:Array<String> = ['みかん','りんご','みかん','ばなな','りんご'];
    var fruitsMap:Map<String, Int> = new Map();
    var count:Dynamic;

    for (fruit in fruitsArray) {
    count = fruitsMap[fruit];
    if(count == null){
    count = 1;
    } else {
    ++count;
    }
    fruitsMap[fruit] = count;
    }
    trace(fruitsMap);
    // 出力 {みかん => 2, りんご => 2, ばなな => 1}

    Haxe で書いた。以下で試して。
    http://try.haxe.org/

    Map に入れたけど、最大値が複数ある場合の、処理がわからない

    154 = :

    >>150
    lodashを使った
    http://jsfiddle.net/5azq6k7q/

    const counts = _.countBy(['みかん','りんご','みかん','ばなな','りんご','りんご']);
    const max = _.max(_.values(counts));
    const picked = _.pickBy(counts, _.partial(_.eq, max));
    const items = _.keys(picked);
    console.log(items);
    // => ["りんご"]

    出現回数が最大のものが複数ある場合を考慮して複数返している

    156 = :

    >>154
    ありがとうございます
    やっぱりライブラリ使わないと難しそうですね

    157 = :

    >>156
    別にライブラリ使わなくてもできるよ。
    ただ見て分かる通り優れたライブラリを使うとこの程度の問題なら
    複雑化の原因になる条件分岐やループを使わずに最小のコード量で実装できる

    158 = :

    すごいな。ちゃんとconstだけでかけちゃってる

    159 = :

    Haxe で書いた通り、まずMap が必要だから、
    ES6(2015) + Babel で、ES5 へ変換

    >>153
    で、Map に入れる所までは書いたから、その後を書けば?
    漏れは、最大値が複数ある場合の、処理がわからなかったけど

    Lodash も、ES6 もほぼ同じ

    160 = :

    ES6は必要最小限しか言語機能として搭載しない
    という考え方があるから、高度なことはできんよ

    >>154の例だとcountByとpickByはない
    その他は代替方法があるが少し冗長になる
    まあ書いてみると良いよ

    161 = :

    ES6 が流行れば、Underscore/Lodash がいらなくなる、という記事が一杯あるけど

    Ruby, Kotlin だと、ライブラリが無くても、かなり簡潔に書けるけど。
    列Aでソートして、それが同じ値なら、さらに列Bでソートするとか

    Kotlin 2
    http://mevius.5ch.net/test/read.cgi/tech/1509462463/18

    162 = :

    >>161
    そこに出てくるMutableListやmutableListOfってのはライブラリだよ

    Kotlin Standard Library の一部
    http://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-mutable-list/index.html
    http://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/mutable-list-of.html

    RubyのArrayも(組み込み)ライブラリ
    http://docs.ruby-lang.org/ja/latest/class/Array.html


    言語の範囲っていうのは一般的にはかなり少なく作るもの
    関数やクラスの文法とか基本的なものだけ
    大部分は標準ライブラリとして実装するのが普通

    残念ながらJavaScript(ES6)の標準ライブラリはかなり小さく作られてる
    その気になれば一気に最低でもRubyレベルまで実装するのは可能だろうになぜかそういうことをしない。
    互換性を保つためなのかブラウザベンダーの負担を減らすためなのか知らんけど

    この方針が変わらない限り、貧弱なライブラリとそれを補うlodashとかの構図は変わらない

    163 = :

     初歩的な質問で恐縮ですが、お分かりの方ご教授ください。

    画像のパスの一部を書き換えるjsを書いてるんですが
    ネットで調べてページすべての画像は↓で変更できるようになったのですが、
    特定のclass(<div class="gallery">)の中にある<img>画像だけ書き換える時の書き方がわかりません。
    jsマスターの方、ご教授ください。

    window.onload = function() {
      var images = document.images;
      for (var i=0, n=images.length; i<n; i++) {
        var img = images[i];
        img.src = img.src.replace(/xxx/, 'xxx_s');
      }
    };

    164 = :

    >>156
    ライブラリ使わなくても単純に考えればいいのよ
    const fruits = ['みかん','りんご','みかん','ばなな','りんご','りんご',];
    const counts = [];
    const result = [];
    let max = 0;
    for (let fruit of fruits) {
    let c = counts[fruit] || 0;
    if (++c >= max) {
    if (c > max) {
    max = c;
    result.length = 0;
    }
    result.push(fruit);
    }
    counts[fruit] = c;
    }

    console.log(result);

    165 = :

    >>163
    jQueryが得意そうな課題だなw
    動かしてないけどこんな感じかな

    $(function() {
     $('.gallery img').attr('src', function() {
      return this.src.replace(/xxx/, 'xxx_s');
     });
    });

    166 = :

    >>163
    var images = document.querySelectorAll("div.gallery img");

    167 = :

    >>165
    >>166
    さっそくありがとうございます。
    お二方のコード双方動きました。
    動くと嬉しいですね~。

    168 = :

    >>167
    あ、ごめん。少し無駄があった。
    (最初のページロードを待つ部分は単に書くのを省略するとして)

    $('.gallery img').attr('src', function(i, src) {
     return src.replace(/xxx/, 'xxx_s');
    });

    もしくは、これで良かったんだ。

    $('.gallery img').attr('src', (i, src) => src.replace(/xxx/, 'xxx_s'));


    なんのためにfunctionを使ったんだ?っていうねw

    169 = :

    文字列の先頭からのマッチングに使うのに適した変数名は何だろう
    startWithか?とか思って検索していて、
    ES6からStringにstartsWithメソッドが追加されているのに気づきました
    こんなメソッド知ってましたか?
    Google書籍検索で「JavaScript startsWith」で検索しても、
    日本語の本は一冊も出てこないところをみると、
    知らない人は決して少なくないと思います
    他にもES6で追加されているのに知らないメソッドがある気がします
    どう調べればいいですか?

    170 = :

    普通にググって見つかるので

    171 = :

    Ruby 初心者スレッド Part 62
    http://mevius.5ch.net/test/read.cgi/tech/1511451329/96

    ちなみに、Ruby でやってみた

    172 = :

    >>164
    答えが複数ある場合でも、OK だね

    ただ、そういう複雑なプログラムを書きたくないから、
    便利な関数を検索していた

    173 = :

    >>164
    ありがとうございます
    みかんとりんごが同数の場合は、どちらか一つが取れればいいので
    こんな感じに書いてみましたが間違ってたらご指摘下さい

    var fruits = ['みかん','りんご','みかん','みかん','ばなな','りんご','りんご',];
    var fruit = fruits.filter(function (value, index, self) {
    if (index === 1) {
    return self.indexOf(value) === index && index !== self.lastIndexOf(value);
    }
    });
    console.log(fruit);

    174 = :

    >>172
    何を持って複雑というかだね。

    俺は条件分岐やループが多く処理の中で状態が
    変化するようなものを複雑だと定義している

    だけど人によっては知らない関数を使うことを
    複雑だと言う人もいるだろう

    175 = :

    >>173
    const counts = _.countBy(['みかん','りんご','みかん','ばなな','りんご','りんご']);
    const max = _.max(_.values(counts));
    const picked = _.pickBy(counts, _.partial(_.eq, max));
    const items = _.keys(picked);
    console.log(items);
    // => ["りんご"]

    さっきの答の最後を書き換えて

    console.log(items[0]);

    こうすればいいだけだよ

    176 = :

    >>174
    > 何を持って複雑というかだね。
    いや、複雑の定義は(いくつか有るとは言え)ソフトウェア業界で決まってるんだから
    いくつか有るうちのどれかに従おうよw

    オンラインで複雑度を調べるサイトぐぐってみたら
    http://jsmeter.info ってのを見つけた
    (意味は知らないのあるからちょっと調べてみようかな)

    >>164の結果
    http://jsmeter.info/m61k7f/1#results
    Statements: 27
    Lines: 17
    Branches: 3
    Depth: 3
    Cyclomatic Complexity: 4
    Halstead Volume: 322
    Halstead Potential: 4.75
    Program Level: 0.0148
    MI: 104.43

    >>154の結果
    http://jsmeter.info/35xbq5/1#results
    Statements: 16
    Lines: 5
    Branches: 0
    Depth: 0
    Cyclomatic Complexity: 1
    Halstead Volume: 223
    Halstead Potential: 4.75
    Program Level: 0.0213
    MI: 126.20

    177 = :

    Statements: 文の数(少ない方が良い)
    Line: 行数(少ない方が良い)
    Branches: 分岐数(少ない方が良い)
    Depth: ネストの深さ(少ない方が良い)
    Cyclomatic Complexity: 循環的複雑度
     10 以下であればよい構造
     30 を越える場合,構造に疑問
     50 を越える場合,テストが不可能
     75 を越える場合,いかなる変更も誤修正を生む原因を作る
    Halstead Volume: よくわからん
     https://www.imagix.com/user_guide_jp/class-metrics.html
     Halstead プログラム量?
    Halstead Potential: よくわからん
     http://se-naist.jp/old/lecture/se3/2006/handouts/productmetrics2.pdf
     語彙の多さに着目した尺度?
    Program Level: 抽象度?(高い方がいい?)
    MI: 保守容易性(高い方がいい)

    178 = :

    >>176-177
    ライブラリのコードを含めて比較しなければ公正とはいえない

    179 = :

    >>168
    両方動きました!
    上級者になると一行で書けるんですね。

    180 = :

    >>178
    ライブラリの部分は十分にテストされて書かなくていい部分だから
    そこを含める必要はないよ

    っていうかその話をするとブラウザの部分まで含めろ
    OSの部分まで含めろってなるだろ

    181 = :

    自分の書くコードをシンプルにするためにライブラリを使うのに
    ライブラリを使ってシンプルにするなど許さん!
    ライブラリの分まで含めるのが公平だ!なんて言ってるのか?
    どんだけ複雑すれば気が済むんだろうか

    182 = :

    そもそも複雑度ってファイルごと、クラスごと、関数毎に出すものだから
    例えライブラリが複雑だとしても、

    ・使ってるライブラリが複雑です
    ・それはそれとしてあなたの書いたコードはシンプルです

    という結果になるだけの話なんだけどね

    対するは、

    ・ライブラリは使ってません
    ・それはそれとしてあなたの書いたコードは複雑です

    となるだけの話

    183 :

    http://mallento.com

    こういうの使って似たようなサービスできんかね
    システムよくわからんから誰かおしえてくれ

    184 = :

    > 自分の書くコードをシンプルにするためにライブラリを使うのに
    そう思っているのはあんただけ
    意味も分からずにhttp://jsmeter.info/ を使っているから、ライブラリを使うためのツールぐらいにしか思えないんだろうな

    185 = :

    >>184
    それで何が言いたいのさ?
    否定だけして、お前の意見が何も書いてないぞ

    186 = :

    プログラム板にも、荒らしが出てるぞ

    元々、荒らしは、全部のスレで、いちゃもんを付けてくる。
    漏れも、何回も攻撃されてる

    プログラミングの話は、一切できないくせに、批判ばっかり書いてるのが荒らし

    ただ、Ruby, JavaScript のスレでは、
    荒らしにかまうから、喜んで居着いてるだけ

    荒らしは一切、無視すべし!

    187 = :

    sortを使えばいいと思う
    こんな感じで

    let fruits = [ 'みかん', 'りんご', 'みかん', 'みかん', 'ばなな', 'りんご', 'りんご', ]

    let map = new Map
    for(let f of fruits) map.set(f, (map.get(f)|0)+1 )
    let [[max]] = [...map].sort( ([,a],[,b])=>b-a )

    188 = :

    >>187
    最大を複数取得したい場合は?

    189 = :

    誰が複数取得したいなんていったんだ?

    190 = :

    >>167が言ってるけど?

    191 = :

    >>188の間違い

    192 = :

    >>188
    あれに付け加えてもいいけど
    別のやり方でもうちょっと汎用的な処理を書くとして例えばこういうのはどう?

    let fruits = [ 'みかん', 'りんご', 'みかん', 'みかん', 'ばなな', 'りんご', 'りんご', ]

    let ary = [] // 個数毎にグループ分けした配列を作る
    fruits.sort().reduce( (c,f,i,a,n=c|0) => (f==a[i+1]) ? n+1 : (ary[n] = [f,...ary[n]||[]]), 0 )

    ary[0] // ["ばなな"] => 個数1
    ary[1] // undefined => 個数2
    ary[ary.length-1] // ["りんご", "みかん"] => 最大個数

    193 = :

    コードゴルフってやつだね

    194 = :

    >>192くらいなら同時に把握しない要素数が10も無いから
    プログラマのワーキングメモリに乗るという意味で普通のコードの範疇だと思う

    195 = :

    関数や命令を知っているという前提で、1行の処理を把握するのに
    5秒以上かかるようなものは普通のコードではないと思う
    コードは読むものであって、解析するものになってはいけない

    196 = :

    場合による
    行数が短く一つのブロックがスクロール無しに見れることも重要
    つかそもそも読む必要はできるだけ少ないほうが良い
    今回のような処理の場合ただ最大個数の要素を得るためだけに十行二十行かけるのは極めて愚策
    そこからの処理が重要なんだから、普通は外部関数化する
    あえてインラインで書くならできるだけ目につかないように短く書いたほうが良い
    仮にもしそこに問題がありそうだということになれば、一行捨てて書き直しても良い程度のものだし

    197 = :

    > つかそもそも読む必要はできるだけ少ないほうが良い

    ということは、ライブラリを使って読むものを減らすのが正解なわけか

    198 = :

    > fruits.sort().reduce( (c,f,i,a,n=c|0) => (f==a[i+1]) ? n+1 : (ary[n] = [f,...ary[n]||[]]), 0 )

    このコードの読むもの = トークン はどれくらいあるのかざっくり数えてみた
    (カッコは省略、連続する変数定義は一つにまとめた)

    fruits
    sort
    reduce
    c,f,i,a,n
    =
    c|0)
    => (
    f==a[
    i+1]
    ) ?
    n+1
    :
    (ary[n] = [
    f,...ary[n]
    ||[]
    ]), 0 )

    全部で16個ぐらい
    これぐらいの量を、ひとつづつ意味を考えながら
    読んでいかないといけない

    199 = :

    >>171
    にも書いた通り、Ruby でも調べたけど、
    最大使用回数が複数ある場合、簡単には取得できない

    最大使用回数を返す場合、1つしか返さない

    strHash = {"a"=>2, "b"=>1, "c"=>2}

    maxCount = strHash.values.max #=> 2
    p strHash.select {|k, v| v == maxCount } #=> {"a"=>2, "c"=>2}

    まず、Hash の全要素をなめて、最大使用回数を取得して、
    その最大使用回数に一致するキーを、Hash の全要素をなめて取得する

    同じHash を、2回走査してしまう。
    一発で取得できないから、無駄を感じる

    200 = :

    >>198
    考え方が逆
    そもそも一度限りのかき捨てのコードなんだから読む必要がない
    問題があれば捨てればいいだけでその時に例えば>>175のような感じだと
    4個も公開変数があるから結局一部を捨てたりということもしづらい
    一部を修正しようと思えば結局全ての行とそのほかの部分の絡みを考えないといけない
    これもワンラインで書くなり使わない変数を削って一つの塊にすべき
    もしくは5行程度なら即時関数にしてスコープ限定してもいいけど
    本当にデバッグを考えたら結局コメントだったりわかりやすさが足りない

    逆に何度も使うんならライブラリ使ったり書いたりする
    もし単関数で取れるライブラリがあればそれで良し
    中途半端な気遣い(?)は一番無駄


    ←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / JavaScript一覧へ
    スレッド評価: スレッド評価について
    みんなの評価 :
    タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

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


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