[整理コード&メソッドロール]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
において、各因子test
がitem
値である場合、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 객체 메서드
:アレイのみ今週の課題...各関数の実装部分...活動場所を表す
Array.prototye 메서드
は、「キー値」と「ベル値」の部分が混同される.{ d: "dog", e: "elephant", f: "flotsam" };
->collection[key]
,value
->key
.つまり、オブジェクトの
key
の値を取得するには、👉 オブジェクト変数名[valueのキー値]です.value
の値を入力するときは、value
または四角カッコdot notation
を使用して値を取得します.数字や文字列などの値は、[]
を使用して値を取得する必要があります.その他は대괄호[]
を使用できます.Object.方法の前に、
dot notation
とfor...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"]
Reference
この問題について([整理コード&メソッドロール]7週目), 我々は、より多くの情報をここで見つけました https://velog.io/@serenity/7주차-과제テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol