元スレ+ JavaScript の質問用スレッド vol.131 +
JavaScript覧 / PC版 /みんなの評価 :
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行程度なら即時関数にしてスコープ限定してもいいけど
本当にデバッグを考えたら結局コメントだったりわかりやすさが足りない
逆に何度も使うんならライブラリ使ったり書いたりする
もし単関数で取れるライブラリがあればそれで良し
中途半端な気遣い(?)は一番無駄
類似してるかもしれないスレッド
- + JavaScript の質問用スレッド vol.131 + (1000) - [100%] - 2017/1/25 8:01
- + JavaScript の質問用スレッド vol.141 + (881) - [97%] - 2021/4/19 9:00
- + JavaScript の質問用スレッド vol.135 + (1002) - [97%] - 2018/11/23 10:30
- + JavaScript の質問用スレッド vol.121 + (1001) - [97%] - 2015/1/1 18:30
- + JavaScript の質問用スレッド vol.121 + (1001) - [97%] - 2022/11/29 16:30
- + JavaScript の質問用スレッド vol.130 + (974) - [97%] - 2016/10/26 14:18
- + JavaScript の質問用スレッド vol.111 + (1001) - [97%] - 2013/11/4 6:00
- + JavaScript の質問用スレッド vol.132 + (1001) - [97%] - 2018/4/19 11:00
- + JavaScript の質問用スレッド vol.133 + (1001) - [97%] - 2018/6/8 10:45
- + JavaScript の質問用スレッド vol.134 + (1001) - [97%] - 2018/8/3 23:15
- + JavaScript の質問用スレッド vol.130 + (1001) - [97%] - 2017/11/25 20:45
- + JavaScript の質問用スレッド vol.136 + (1001) - [97%] - 2019/1/8 11:30
- + JavaScript の質問用スレッド vol.138 + (1004) - [97%] - 2019/4/20 23:45
- + JavaScript の質問用スレッド vol.139 + (1001) - [97%] - 2019/5/27 15:15
- + JavaScript の質問用スレッド vol.101 + (1001) - [97%] - 2012/7/16 14:15
- + JavaScript の質問用スレッド vol.141 + (1001) - [97%] - 2019/9/22 23:15
- + JavaScript の質問用スレッド vol.137 + (1003) - [97%] - 2019/3/26 11:46
トップメニューへ / →のくす牧場書庫について