Javascript
 Computer >> コンピューター >  >> プログラミング >> Javascript

JavaScriptでのRubyのそれぞれの短所に相当


each_cons()-Ruby

each_cons() 列挙可能なメソッドは、Rubyに組み込まれているメソッドであり、各要素から毎回連続するN個の要素を繰り返し処理します。ブロックが指定されていない場合は、列挙子を返します。

each_cons()と同等のJS

Numberリテラルの配列(この場合はRubyの列挙可能に相当するJS)があるとすると、each_cons関数は、配列の各要素に対して実行され、数値N(N <=配列の長さ)を受け入れるArray関数であると想定されます。唯一の引数。そして、サイズNのサブ配列を持つ配列を返します。各サブ配列は、すべての要素から1つずつ始まります。

この例では、状況が少し明確になります。

このような配列があるとします-

const arr = [1, 2, 3, 4, 5];
console.log(arr.eachCons(2));

eachConsへのこの呼び出しは、次のようにそれぞれ2つの要素を持つ配列の配列を形成するということです-

[[1, 2], [2, 3], [3, 4], [4, 5]]

サブ配列は、できるようになるまで、元の配列の要素ごとに作成されることに注意してください。

Nの値が2ではなく3だった場合、結果は次のようになります-

[[1, 2, 3], [2, 3, 4], [3, 4, 5]]

ここでも、配列に十分な要素ができるまで、配列のすべての要素に対してサブ配列が作成されます。

アプローチ

この問題を解決するために、スライディングウィンドウアルゴリズムを使用します。

最新のES6関数を使用してこれを2行で解決できますが、前者のアプローチは後者と比較して非常に効率的です。

まず、0からNのインデックスまでの初期ウィンドウを作成するwhileループを利用します。それで。ウィンドウの終わりがまだ元の配列の長さよりも短い間に実行されるforループを使用します。

このループは、ウィンドウの安定性(つまり、ウィンドウの長さがNに等しい)をチェックします。ウィンドウが安定している場合は、ウィンドウ(そのサブ配列を結果配列に挿入)を挿入し、単位距離だけ右にスライドします。それを折りたたむ(つまり、開始=終了)。ウィンドウが不安定な場合は、要素を追加し続けます。

このアプローチのコードは-

です。

const arr = [1, 2, 3, 4, 5];
const eachCons = function(num){
   let res = [], temp = [];
   let start = 0, end = 0;
   while(end < num){
      temp.push(this[end++]);
   };
   for(; end <= this.length ;){
      if(temp.length === num){
         res.push(temp);
         start++;
         end = start;
         temp = [];
      }
      temp[end-start] = this[end];
      end++;
   }
   return res;
};
Array.prototype.eachCons = eachCons;
console.log([1, 2, 3, 4, 5].eachCons(1));
console.log([1, 2, 3, 4, 5].eachCons(2));
console.log([1, 2, 3, 4, 5].eachCons(3));
console.log([1, 2, 3, 4, 5].eachCons(4));

出力

コンソールの出力は-

になります
[ [ 1 ], [ 2 ], [ 3 ], [ 4 ], [ 5 ] ]
[ [ 1, 2 ], [ 2, 3 ], [ 3, 4 ], [ 4, 5 ] ]
[ [ 1, 2, 3 ], [ 2, 3, 4 ], [ 3, 4, 5 ] ]
[ [ 1, 2, 3, 4 ], [ 2, 3, 4, 5 ] ]

  1. JavaScriptでオブジェクトごとに一意のIDを作成するにはどうすればよいですか?

    以下は、オブジェクトごとに一意のIDを作成するためのコードです- 例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> <style>  

  2. JavaScriptで各ノードの次に大きいノードを見つける

    問題 リンクリストの先頭を最初で唯一の引数として受け取るJavaScript関数を作成する必要があります。 node_i.val、jは可能な限り最小の選択肢です。そのようなjが存在しない場合、次に大きい値は0です。 この関数は、対応する要素がリスト内の要素の次に大きい要素である配列を準備して返す必要があります。 たとえば、リストが-の場合 その場合、出力は-になります。 const output = [7, 0, 5, 5, 0]; 出力の説明: 2の次に大きい要素は7であるため、7の場合、それ以上の要素はありません。 例 このためのコードは-になります class Nod