忙しくて放置気味だったけど、久しぶりに。
お題は引数として渡された2つの文字列から、両方に登場している単語をアルファベット順に直して返すというもの。
例)
"one, two, three", "two, four, three"
=> "three, two"
10分やと最初は思ったけど、なんやかんやのつまづきがあって、90分くらいかかった。悲しい
自分の回答
function commonWords(first, second) {
//variables
let answer = [];
let answer2 = '';
let s1 = first.split(",");
let s2 = second.split(",");
for (let i of s1) {
for (let j of s2) {
if (i === j) {
answer.push(i);
}
}
}
answer.sort(function(a,b) {
if( a < b ) return -1;
if( a > b ) return 1;
return 0;
});
answer2 = answer.join(',');
console.log(answer2);
return answer2;
}
無念である。なんなのだこれはどうすればいいのだ!
後々調べてわかったのは、sortは比較関数を渡さなかったら、辞書順にソートするデフォルトが備わってたらしい。
すごいかいとう
function commonWords(first, second) {
return first.split(",").filter(x => second.split(",").includes(x)).sort().join(",");
}
そう、書きたかったのはこういうやつ・・・美しい。
なるほど、やってる処理はほぼ一緒だけど、filterのcallbackがミソぽい。
学び
sort(compareFunction)
- 引数に比較関数を渡して並べ替えの処理内容を指定することができるが、指定しなければ数字は昇順、文字列は辞書順に並べ替えてくれる。
join(attr)
- 配列の要素をattrで区切った文字列に連結する。省略すれば、カンマで区切る。
includes(attr[, fromIndex])
- 配列に引数の要素が含まれているかを調べて真偽を返す。fromIndexで検索を開始する位置を指定できて、マイナスを渡せば最後からの検索になる。配列だけでなく、文字列のような要素に対しても使える。
let i = "one";
i.includes('one'); //true
let i = "onetwothree";
i.includes('one'); //true
反省
チェインの処理を今度書いてみる。