【JavaScript】文字列を先頭と末尾から交互に取り出して等しい長さの部分文字列に分割する方法
今回は、文字列と整数 n の2つの引数を受け取り、文字列を n 個の「同じ長さの部分文字列」に分割した配列を返すJavaScript関数を作成します。なお、n は文字列の長さを割り切れる値である必要があります。
要件と考え方
各部分文字列の長さは「文字列の長さ ÷ n」で求めることができます。そして、各部分文字列は元の文字列の先頭の文字と末尾の文字を交互に取り出して構成します。
例えば、文字列が "how"、n が 3 の場合、出力は次のようになります。
["h", "w", "o"];
この例では、各部分文字列はちょうど「(文字列の長さ / n) = 3 ÷ 3 = 1 文字」を含みます。まず先頭から "h"、次に末尾から "w"、再び先頭から "o" を取り出しているのがわかります。
もう少し長い例も見てみましょう。文字列が "abcdef"、n が 3 の場合、各部分文字列は 6 ÷ 3 = 2 文字になります。
["af", "be", "cd"];
コード例
以下が実装のコードです。
const str = "how";
const num = 3;
const segregate = (str, n) => {
// n が文字列の長さを割り切れない場合は false を返す
if(str.length % n !== 0){
return false;
}
const len = str.length / n; // 各部分文字列の長さ
const strArray = str.split(""); // 文字列を1文字ずつの配列に変換
const arr = [];
let i = 0, char;
while(strArray.length){
// 偶数回目は先頭から、奇数回目は末尾から文字を取り出す
if(i % 2 === 0){
char = strArray.shift();
}else{
char = strArray.pop();
};
// 取り出した文字を適切な部分文字列に追加する
if(i % len === 0){
arr[i / len] = char;
}else{
arr[Math.floor(i / len)] += char;
};
i++;
};
return arr;
};
console.log(segregate(str, num));
出力
コンソールには次の出力が表示されます。
[ 'h', 'w', 'o' ]
コードの解説
この実装のポイントは以下の3点です。
- 入力チェック:
str.length % n !== 0の場合、文字列を n 等分できないためfalseを返して処理を中断します。 - 交互に取り出し: カウンタ i の偶奇を判定し、偶数回目は
shift()で配列の先頭の文字を、奇数回目はpop()で末尾の文字を取り出します。 - 配列への格納:
i / lenから現在の文字が属する部分文字列のインデックスを算出します。区切り目(i % len === 0)では新しい要素を作成し、それ以外は既存の要素に文字を連結していきます。
このように、shift() と pop() を組み合わせることで、文字列の両端から順に文字を消費しながら、指定された個数の部分文字列を簡単に生成できます。
-
JavaScriptで数値文字列を0と1のビット列にエンコードする方法
問題 10進数を表す文字列を受け取り、決められたルールに従って「0」と「1」だけで構成される文字列へエンコードするJavaScript関数を実装します。 エンコードのルール 入力文字列の各桁の数字 d に対して、次の手順で符号語を作ります。 d を2進数で表したときのビット数を k とする 「0」を k−1 個並べ、その後ろに「1」を1つ付けた文字列をプレフィックスとする 数字 d 自身を2進数の文字列として表す(最右ビットが最下位ビット) プレフィックスと2進表現を連結したものが d の符号語になる 最後に、すべての桁について得られた符号語を順番に連結したものが、全体のエンコード結果と
-
JavaScriptで指定した文字数に文字列を切り詰める方法
JavaScriptでは、長いテキストを一覧表示やプレビュー用に短く表示したい場面がよくあります。この記事では、文字列と数値を受け取り、指定された文字数を超える場合は文字列を切り詰めて末尾に「...」を付けて返す関数の実装方法を解説します。要件作成する関数は、文字列と数値の2つの引数を受け取ります。文字列の長さが指定された数値より大きい場合は、先頭から指定文字数分だけ切り取った文字列に「...」を連結して返します。切り詰める必要がない場合(元の文字列が指定文字数以下の場合)は、元の文字列をそのまま返します。コード例以下がその実装コードです。 { const { length: len