[整理コード&メソッドロール]7週目

8234 ワード

[lodash Library制作]


.identity


引数として渡される値を返します.
この関数はあまり役に立たないように見えます.
この方法は、関数が重複文字を渡さないときに重複文字を指定する必要がある場合に便利です.
_.identity = function (val) {
  return val;
};

.first


配列の前のn要素の配列を返します.
nが定義されていない場合は、最初の要素のみが返されます.
_.first = function (array, n) {
   return n === undefined ? array[0] : array.slice(0, n);
 };

.last


nが定義されていない場合、最後の要素(例えば.first)が返される.
nが0の場合、空の配列を返し、後から値を入力します.
 _.last = function (array, n) {
   if (n === 0) return []; // n 이 0일 경우는 빈 배열을 반환

   return n === undefined ? array[array.length - 1] : array.slice(-n);
 };

.each->forEachに似ています()


セット内の各要素のiterator(value, key, collection)が呼び出されます.
配列とオブジェクトを同時に許可する必要があります
注:_.eachは値を返しませんが、入力セット内の各項目に対して反復関数を実行します.
  _.each = function (collection, iterator) {
    if (Array.isArray(collection)) {
      for (let i = 0; i < collection.length; i++) {
        iterator(collection[i], i, collection);
      }
    } else if (typeof collection === "object" && collection !== null) {
      for (const key in collection) {
        if (Object.prototype.hasOwnProperty.call(collection, key)) {
          iterator(collection[key], key, collection);
        }
      }
    }
  };

.indexOf


配列内の値が見つかるインデックスを返します.または、配列に値がない場合は-1を返します.
複数の値がある場合は、最初のインデックスが返されます.
_.indexOf = function (array, target) {
    var result = -1;

    _.each(array, function (item, index) {
      if (item === target && result === -1) {
        result = index;
      }
    });

    return result;
  };
上記のコードでは、条件文にresult === -1の条件が含まれているのはなぜですか.条件文ではこれらの値が削除されています.
テストに一致する複数の値がある場合、最初のインデックスを返す条件が合格しませんでした.
だから、私たちがこのような条件を提出したのは、そのためだと思います.
ずっと理解できなくて分かりました.
->リスニングif (item === target)という条件しかない場合、配列に複数の一致要素がある場合、一致要素の最後のインデックス値が返されます.なぜなら、一致する値が複数ある場合、パトロール中にresultの値が変更され続けるからである.
(つまり、each関数内ではfor文をループする回数が配列の長さと同じなので、該当する条件がなければ最終的に出力されるインデックス値が最後の要素のインデックスとなります.この要素が見つかったら、直接割り込みをする方が効率的ではないでしょうか?))
したがって、var result = -1;の値を初期値で宣言し、条件文に対応する論理を追加すると、最初の一致要素のインデックス値が吐き出されます.
なぜなら、最初の要素が巡回するとき、resultの値は-1と宣言されるからである.前述したように、一致する要素が複数ある場合、resultの値を変更し続けるため、条件文を指定すると、最初の一致する要素のインデックスが返される.

.filter


与えられた関数でテストされたすべての要素を収集し、新しい配列に戻ります.
_.filter = function (collection, test) {
  const result = [];

  _.each(collection, function (item) {
    if (test(item)) {
      result.push(item);
    }
  });

  return result;
};
上記のresultでは、1番目のパラメータ値が_.each 메서드であり、2番目のパラメータ値がcollectionであるため、匿名関数はiteratorを意味する.iteratorの因子filterにおいて、各因子testitem値である場合、true変数に含まれる原理.
匿名関数の意味はresultであるため、配列であればiteratorから_.each 메서드が第一因子として、各因子、第二因子がiterator(collection[i], i, collection);となるので、匿名関数のindexは第一因子としての各因子を意味する.

.reject

itemとは対照的に、通過していないすべての要素が収集され、新しい配列に戻されます.
_.reject = function (collection, test) {
    return _.filter(collection, item => !test(item));
  };
filterとは逆に、通過しない値を返すため、filterを使用して値を返す.

.map


アレイ内の各要素に対して指定された関数を呼び出す結果を収集し、新しいアレイを返します.
 _.map = function (collection, iterator) {
    const result = [];

    _.each(collection, function (item) {
      result.push(iterator(item));
    });

    return result;
  };
filterとeachは似ているように見えますが、条件なしにすべての要素に対して関数(eachと似ている)を実行するため、上記のイッツメソッドを使用して値を返します.

.reduce


アレイ内の各要素に対して指定されたreducer関数を実行し、結果値を返します.
 _.reduce = function (collection, iterator, accumulator) {
    let accumulatorCopy = accumulator;
    let collectionCopy = collection;

    if (accumulator === undefined) {
      accumulatorCopy = collection[0];
      collectionCopy = collection.slice(1);
    }

    _.each(collectionCopy, function (item) {
      accumulatorCopy = iterator(accumulatorCopy, item);
    });

    return accumulatorCopy;
  };
パラメータの値を任意に再定義すると、パラメータのパラメータが混同される可能性があります.
したがって、このパラメータ値を変数にコピーして使用します.

.contains


要素が含まれている場合はtrueを返します.そうでない場合はfalseを返します.
  _.contains = function (collection, target) {
    return _.reduce(
      collection,
      function (wasFound, item) {
        if (wasFound) {
          return true;
        }

        return item === target;
      },
      false
    );
  };

.every


アレイ内のすべての要素が所定の判別関数を通過するかどうかをテストします.Boolean値を返します.
 _.every = function (collection, iterator = _.identity) {
  // TIP: Try re-using reduce() here.
  return _.reduce(
    collection,
    function (wasFound, item) {
      if (!wasFound) {
        return false;
      }

      return !!iterator(item);
    },
    true
  );
};

.some


アレイ内の任意の要素が所定の判別関数を通過するかどうかをテストします.

[整理]


反复文的类型

  • not operator:古典的な繰り返し文
  • for문:スモールツアーのみ
  • for...of:オブジェクトのpropertyキーのみがリストされます(プロトコルタイプチェーンに注意)
  • for...in:アレイ巡回のみの方法
  • forEach():クラシック
  • while:唯一のセミコロンがちょうどいいです
  • do...while:対象巡回のみ
  • Object.keys()
  • Object.values()
  • Object.entires()
  • Object 객체 메서드:アレイのみ
  • for...in / for...差異
  • 『指図迷津』
    今週の課題...各関数の実装部分...活動場所を表すArray.prototye 메서드は、「キー値」と「ベル値」の部分が混同される.{ d: "dog", e: "elephant", f: "flotsam" };->collection[key],value->key.
    つまり、オブジェクトのkeyの値を取得するには、👉 オブジェクト変数名[valueのキー値]です.valueの値を入力するときは、valueまたは四角カッコdot notationを使用して値を取得します.数字や文字列などの値は、[]を使用して値を取得する必要があります.その他は대괄호[]を使用できます.
    Object.方法の前に、dot notationfor...in문の違いは、Object 메소드には、プロトタイプチェーンのプロパティもリストされます.

    Object.entires()

    for-in루프と同じ順序で、指定されたオブジェクト自体の列挙可能な属性「キー、値」ペアの配列を返します.
    // Or, using array extras
    Object.entries(obj).forEach(([key, value]) => {
    console.log(`${key} ${value}`); // "a 5", "b 7", "c 9"
    });
    
    
    // array like object
    const obj = { 0: 'a', 1: 'b', 2: 'c' };
    console.log(Object.entries(obj)); // [ ['0', 'a'], ['1', 'b'], ['2', 'c'] ]
    
    
    // example
    const object1 = {
      a: 'somestring',
      b: 42
    };
    
    for (const [key, value] of Object.entries(object1)) {
      console.log(`${key}: ${value}`); 
      // "a: somestring", "b: 42"
    個人的には、for...inゲートを使用するのはfor...inゲートを使用するよりも良いです.プロトタイプチェーンを使用しないからです.

    Object.keys()


    指定したオブジェクトのプロパティ名を、通常の繰り返し文と同じ順序でループするリスト可能な配列に戻します.
    const object1 = {
      a: 'somestring',
      b: 42,
      c: false
    };
    
    console.log(Object.keys(object1));
    // expected output: Array ["a", "b", "c"]

    Object.values()


    渡されたパラメータオブジェクトが持つ(リスト可能)属性の値からなる配列を返します.この配列の順序はObject.entires構文と同じです.
    const object1 = {
      a: 'somestring',
      b: 42,
      c: false
    };
    
    console.log(Object.keys(object1));
    // expected output: Array ["a", "b", "c"]
  • 参考サイト