lodash中国語学習拾零のCollection編
30644 ワード
作者:Soring_Tigerの転載は出所を明記してください.
前情摘要1:lodash中国語学習拾零のAray編前情提要2:lodash中国語学習拾零のChin編
3、コレクションとアラーの違い
lodashの初心者にとって、どうしてlodashはarrayとCollectionの二つの方法を提供しているのか分かりません.表面的にはこの2つの方法のように見えるのですが、交換できるところがあります.そこで、我々はさらに、何がコレクション方法であるかを明らかにします.
lodashでは、Collectionは抽象的な概念であり、反復のためにJavascript Objectを用意しています.配列、文字列またはobjectオブジェクトとすることができます.これらのデータタイプの違いについては、lodashによって隠されています.開発者としては心配しなくてもいいです.
lodashのAray方法はそんなに抽象的ではありません.それらがあなたに要求するのは実際の行列です.この意味では、たとえAray方法が明示的にあなたが提示したデータの種類を検査しなくても、それらはあなたが提出したデータに数値型length属性が必要です.
実際には、ほとんどの場合、arraysとcollectionの違いを厳格に区別する必要はありません.なぜなら、あなたが直面する多くのcollectionは配列の形で現れています.比較的少ない場合だけ、差に直面しています.ですから、Arayメソッドはデータタイプ(数値タイプのlength属性があります)を厳格に要求すればいいということを覚えてください.
3.1 collection要素を遍歴する
3.1.1.forEach
_.forEachはCollectionを処理する最も基本的な関数です.以下の例は非常に簡単です.つまり、forEachはどのように反復するかを教えます.
_.forEach文書の定義は次の通りです.Aliases(別名):u.each
Agments(パラメータ):1、collection(Aray_Object_string):The collection to iterate over.2、[iteratee=u.identity]:The function invoked per iteration.3、[thAring](The.Binting)
と.forEachの実行方向は逆で、一番右側の要素から先に反復を開始します.
順序付けは私達がcollectionを操作する時よく出会う問題で、javascriptは持っているsort()、reverse()などの関数を持って、はるかに私達の需要を満たすことができません.
3.3.1.sortBy
_.sortByは、入力されたcollectionの各配列要素をディケンサによって計算した後に並べ替え(昇順)し、新しい配列を生成し、元のcollectionの並べ替えに影響を与えない.
.sortByは.forEachと同じ3つのパラメータがあります.
ディレクタ自体には三つのパラメータがありますが、forEachのディレクタと同じです.
と.sortByは類似していますが、複数のproperty nameまたは複数のローズマリーを並べ替えることができます.並べ替えの順序は、ローズマリーの順にあります.
_に似ているsortByAllですが、ローズマリーごとの昇降順がとても柔軟です.
既存のデータセットでデータを検索してフィルタリングする機能がよく使われています.データのフィルタリングと検索を実現するために、一連のツールが提供されます.
3.4.1_.where
whereはlodashの中で一番簡単なデータのフィルタリング方法です.条件ごとに一致するデータだけが取り除かれます.whereの長所は簡単で正確で厳格です.
Note:This method supports compring arrays,bootleans,Date object,numbers,Object object,regexes,and streings.Object s.empred by.their own,not inherited,enumerable properties.Folunese.contres.matches Property.
注意:whereサポート配列、ブール値、日付、数値、Objectタイプ、正規表現、文字列の比較、Objectタイプは自分自身の非継承のエニュメレーション属性しか比較できません.個々のObjectまたは継承属性を比較するには_.matches Property
_.filterにはいろいろなフィルタリング方法があります.matches(2)_.matches Property(3)_.property
集合の中から何を選ぶかは分かりませんが、何を選ぶかは分かります.
場合によっては、条件に合ったすべてのデータを見つける必要はなく、第一条だけで十分であれば、findシリーズ(find、findLast、findWhere)、findシリーズのパラメータはfilterと同じですが、戻り値は配列ではなく、条件に合う要素です.条件に合うものが見つからなかったらundefinedに戻ります.
3.5.1_.find
最初の条件に合致する配列要素を探します.つまり配列の左側から探します.
最後の条件に合う配列要素を探します.つまり配列の右側から探します.
パラメータsourceはobjectで、厳密にsourceによってマッチングの第一項を探します.
lodashには、Collectionを新しいデータ構造に改造するためのツールがあります.また、二つ以上のセットを一つのセットに統合するためのツールもあります.これらのツールは、私たちのプログラム犬を重労働から解放し、コードをよりわかりやすくします.
3.6.1_.グループBy
集合の中には、いくつかの要素の属性の値が同じである場合があります.この属性はkeyでグループ化され、新しいJSONオブジェクトが生成されます.このJSONオブジェクトのkeyはグループ化された値です.
_.groupByには3つのパラメータがあり、1つ目のパラメータは処理されるcollectionであり、2番目のパラメータはディズエ代数器(匿名関数として現れる)であり、3番目のパラメータはThe this binding of iterateである.
groupByとindexByの違いは、groupBy重合の値が配列形式で現れ、indexByで得られた値がObject形式で出現することである.
_.min(collection,[iteratee],[thisArg])_.max(collection,[iteratee],[thisArg])
その条件に適合する最小(または最大)の配列要素を探し出す.
集合中のデータは入れ子構造の場合があり、それらを平準化する必要があります.いくつかの場合、セットの中の要素には無駄な値が含まれています.圧縮処理ができます.平準化と圧縮により,解析と実証のためにより,より洗練されたデータ構造を得ることができた.
3.8.1_.そして私
someの役割は、集合中に要求に該当する属性があれば、trueに戻ります.そうでなければfalseに戻ります.
_.everyは、集合中の各要素が含まれているかどうかを判断します.
1、配列は集合に違いないので、すべてのCollecton方法は配列に適用されます.2、集合は必ずしも行列ではない.3、本節では、Map、reduce、reduceRightなど、少量のCollectionの方法は言及されていません.Map/Reduce編で紹介されます.
前情摘要1:lodash中国語学習拾零のAray編前情提要2:lodash中国語学習拾零のChin編
3、コレクションとアラーの違い
lodashの初心者にとって、どうしてlodashはarrayとCollectionの二つの方法を提供しているのか分かりません.表面的にはこの2つの方法のように見えるのですが、交換できるところがあります.そこで、我々はさらに、何がコレクション方法であるかを明らかにします.
lodashでは、Collectionは抽象的な概念であり、反復のためにJavascript Objectを用意しています.配列、文字列またはobjectオブジェクトとすることができます.これらのデータタイプの違いについては、lodashによって隠されています.開発者としては心配しなくてもいいです.
lodashのAray方法はそんなに抽象的ではありません.それらがあなたに要求するのは実際の行列です.この意味では、たとえAray方法が明示的にあなたが提示したデータの種類を検査しなくても、それらはあなたが提出したデータに数値型length属性が必要です.
実際には、ほとんどの場合、arraysとcollectionの違いを厳格に区別する必要はありません.なぜなら、あなたが直面する多くのcollectionは配列の形で現れています.比較的少ない場合だけ、差に直面しています.ですから、Arayメソッドはデータタイプ(数値タイプのlength属性があります)を厳格に要求すればいいということを覚えてください.
3.1 collection要素を遍歴する
3.1.1.forEach
_.forEachはCollectionを処理する最も基本的な関数です.以下の例は非常に簡単です.つまり、forEachはどのように反復するかを教えます.
var collection = [
' ',
' ',
' ',
' '
];
_.forEach(collection, function(name) {
console.log(name);
});
// →
//
//
//
//
_.forEachには三つのパラメータがあります.一つ目のパラメータは処理されるcollectionで、二つ目のパラメータはディエ代数器で、三つ目のパラメータはThe this binding of iterateです._.forEach文書の定義は次の通りです.Aliases(別名):u.each
Agments(パラメータ):1、collection(Aray_Object_string):The collection to iterate over.2、[iteratee=u.identity]:The function invoked per iteration.3、[thAring](The.Binting)
//
var collection = [100,200,300,400];
_.forEach(collection, function(value) {
console.log(this.sqrt(value)); // collection
},
Math); // thisArg Math
//10
//14.142135623730951
//17.320508075688775
//20
反復が発生すると、各要素は次のステップに1回のローズマリーをアクティブにし、ローズマリーは3つのパラメータを有する.(1)反復される要素、(2)要素のindexまたはkey、(3)collection.ローズマリーがfalse値に戻ると、次の例のように、反復プロセス全体が早期に終了することができます.var myCollection = [
' ',
' ',
' ',
' '
];
_.forEach(myCollection, function(name, index, collection) {
if (name === ' ') {
console.log(' index: ' + index);
console.log(collection[index]);
return false;
}
});
// → index: 1
// →
3.1.2.forEachRightと.forEachの実行方向は逆で、一番右側の要素から先に反復を開始します.
_([1, 2]).forEachRight(function(n) { console.log(n); }).value();
// → 2
// → 1
3.3並べ替え順序付けは私達がcollectionを操作する時よく出会う問題で、javascriptは持っているsort()、reverse()などの関数を持って、はるかに私達の需要を満たすことができません.
3.3.1.sortBy
_.sortByは、入力されたcollectionの各配列要素をディケンサによって計算した後に並べ替え(昇順)し、新しい配列を生成し、元のcollectionの並べ替えに影響を与えない.
.sortByは.forEachと同じ3つのパラメータがあります.
ディレクタ自体には三つのパラメータがありますが、forEachのディレクタと同じです.
//_.sortBy
_.sortBy([1, 2, 3], function(n) {
return Math.sin(n); // Math
});
// → [3, 1, 2]
_.sortBy([1, 2, 3], function(n) {
return this.sin(n); // this Math
}, Math);
// → [3, 1, 2]
var users = [
{ 'user': 'fred' },
{ 'user': 'pebbles' },
{ 'user': 'barney' }
];
// 'user' 'user' ,
_.pluck(_.sortBy(users, 'user'), 'user');
// → ['barney', 'fred', 'pebbles']
_.sorByは配列だけでなく文字列にも同じように作用します._.sortBy('cBa').join('')
//Bac , , join
_.sortBy('cBa')
//[ 'B', 'a', 'c' ] , sortBy
並べ替え後に配列要素を動的に追加し、_を使用します.sortedIndexは、新しい元素を自動的に作成された順に並べられます.これは思いやりのあるデザインです.var collection = [
'Carl',
'Gary',
'Luigi',
'Otto'
];
var name = 'Luke'; //
collection.splice(_.sortedIndex(collection, name), 0, name);
// _.sortedIndex collection
// →
// [
// "Carl",
// "Gary",
// "Luigi",
// "Luke",
// "Otto" // ]
3.3.2_.sortByAllと.sortByは類似していますが、複数のproperty nameまたは複数のローズマリーを並べ替えることができます.並べ替えの順序は、ローズマリーの順にあります.
var users = [
{ 'user': 'fred', 'age': 48 },
{ 'user': 'barney', 'age': 36 },
{ 'user': 'fred', 'age': 42 },
{ 'user': 'barney', 'age': 34 }
];
// 'user' , 'age'
_.map(_.sortByAll(users, ['user', 'age']), _.values);
// → [['barney', 34], ['barney', 36], ['fred', 42], ['fred', 48]]
_.map(_.sortByAll(users, 'user', function(chr) {
return Math.floor(chr.age / 10);
}), _.values);
// → [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 42]]
3.3.3_.sortByOrder_に似ているsortByAllですが、ローズマリーごとの昇降順がとても柔軟です.
var users = [
{ 'user': 'fred', 'age': 48 },
{ 'user': 'barney', 'age': 34 },
{ 'user': 'fred', 'age': 42 },
{ 'user': 'barney', 'age': 36 }
];
// 'user' , 'age'
_.map(_.sortByOrder(users, ['user', 'age'], ['asc', 'desc']), _.values);
// → [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 42]]
3.4データフィルタと検索既存のデータセットでデータを検索してフィルタリングする機能がよく使われています.データのフィルタリングと検索を実現するために、一連のツールが提供されます.
3.4.1_.where
whereはlodashの中で一番簡単なデータのフィルタリング方法です.条件ごとに一致するデータだけが取り除かれます.whereの長所は簡単で正確で厳格です.
Note:This method supports compring arrays,bootleans,Date object,numbers,Object object,regexes,and streings.Object s.empred by.their own,not inherited,enumerable properties.Folunese.contres.matches Property.
注意:whereサポート配列、ブール値、日付、数値、Objectタイプ、正規表現、文字列の比較、Objectタイプは自分自身の非継承のエニュメレーション属性しか比較できません.個々のObjectまたは継承属性を比較するには_.matches Property
var collection = [
{ name: ' ', age: 19, gender: ' ' },
{ name: ' ', age: 21, gender: ' ' },
{ name: ' ', age: 20, gender: ' ' },
{ name: ' ', age: 30, gender: ' ' }
];
_.where(collection, { age: 30, gender: ' ' });
// →
// [
// { name: ' ', age: 30, gender: ' ' }
// ]
3.4.2.filter_.filterにはいろいろなフィルタリング方法があります.matches(2)_.matches Property(3)_.property
//
_.filter([4, 5, 6], function(n) {
return n % 2 == 0;
});
// → [4, 6]
var users = [
{ 'user': 'barney', 'age': 36, 'active': true },
{ 'user': 'fred', 'age': 40, 'active': false }
];
// using the `_.matches` callback shorthand
_.pluck(_.filter(users, { 'age': 36, 'active': true }), 'user');
// → ['barney']
// using the `_.matchesProperty` callback shorthand
_.pluck(_.filter(users, 'active', false), 'user');
// → ['fred']
// using the `_.property` callback shorthand
_.pluck(_.filter(users, 'active'), 'user');
// → ['barney']
_.filterはまた、サブジェネレータのフィルタリングを受けることができます.var collection = [
{ type: ' ', size: 'L' },
{ type: ' ', size: 'S' },
{ type: 'T ', size: 'XL' },
{ type: ' ', size: 'M' }
];
_.filter(collection, function(item) {
return item.size === 'L' || item.size === 'M';
});
// → // [
// { type: " ", size: "L" },
// { type: " ", size: "M" }
// ]
3.4.3.reject集合の中から何を選ぶかは分かりませんが、何を選ぶかは分かります.
// enabled:false
var collection = [
{ name: ' ', enabled: true },
{ name: ' ', enabled: false },
{ name: ' ', enabled: false },
{ name: ' ', enabled: true }
];
_.reject(collection, { enabled: false });
// →
// [
// { name: " ", enabled: true },
// { name: " ", enabled: true }
// ]
3.5必要なデータだけを探してください.場合によっては、条件に合ったすべてのデータを見つける必要はなく、第一条だけで十分であれば、findシリーズ(find、findLast、findWhere)、findシリーズのパラメータはfilterと同じですが、戻り値は配列ではなく、条件に合う要素です.条件に合うものが見つからなかったらundefinedに戻ります.
3.5.1_.find
最初の条件に合致する配列要素を探します.つまり配列の左側から探します.
var users = [
{ 'user': ' ', 'age': 36, 'active': true },
{ 'user': ' ', 'age': 45, 'active': false },
{ 'user': ' ', 'age': 20, 'active': true },
{ 'user': ' ', 'age': 20, 'active': true }
];
_.result(_.find(users, function(chr) {
return chr.age < 40; // age 40
}), 'user');
// → ' '
3.5._.findLast最後の条件に合う配列要素を探します.つまり配列の右側から探します.
_.findLast([1, 2, 3, 4], function(n) {
return n % 2 == 1;
});
// → 3
3.2.3_.findWhereパラメータsourceはobjectで、厳密にsourceによってマッチングの第一項を探します.
var users = [
{ 'user': ' ', 'age': 36, 'active': true },
{ 'user': ' ', 'age': 45, 'active': false }
];
_.result(_.findWhere(users, { 'age': 36, 'active': true }), 'user');
// → ' '
_.result(_.findWhere(users, { 'age': 45, 'active': false }), 'user');
// → ' '
3.6「集合」改造(Trans forming collection)lodashには、Collectionを新しいデータ構造に改造するためのツールがあります.また、二つ以上のセットを一つのセットに統合するためのツールもあります.これらのツールは、私たちのプログラム犬を重労働から解放し、コードをよりわかりやすくします.
3.6.1_.グループBy
集合の中には、いくつかの要素の属性の値が同じである場合があります.この属性はkeyでグループ化され、新しいJSONオブジェクトが生成されます.このJSONオブジェクトのkeyはグループ化された値です.
_.groupByには3つのパラメータがあり、1つ目のパラメータは処理されるcollectionであり、2番目のパラメータはディズエ代数器(匿名関数として現れる)であり、3番目のパラメータはThe this binding of iterateである.
groupByとindexByの違いは、groupBy重合の値が配列形式で現れ、indexByで得られた値がObject形式で出現することである.
// : size , JSON "S" "M" Key
var collection = [
{ name: 'Lori', size: 'S' },
{ name: 'Johnny', size: 'M' },
{ name: 'Theresa', size: 'S' },
{ name: 'Christine', size: 'S' }
];
_.groupBy(collection, 'size');
// {
// S:[
// { name: "Lori", size: "S" },
// { name: "Theresa", size: "S" },
// { name: "Christine", size: "S" }
// ]
// M: [
// { name: "Johnny", size: "M" }
// ]
// }
// , key
var collection = [
{ name: ' ', age: 20 },
{ name: ' ', age: 50 },
{ name: ' ', age: 67 },
{ name: ' ', age: 39 }
];
_.groupBy(collection, function(item) {
return item.age > 65 ? 'retired' : 'working';
});
// →
// {
// [
// working: [
// { name: " ", age: 20 },
// { name: " ", age: 50 },
// { name: " ", age: 39 }
// ],
// retired:[
// { name: " ", age: 67 }
// ]
// }
3.6.2 min、max_.min(collection,[iteratee],[thisArg])_.max(collection,[iteratee],[thisArg])
その条件に適合する最小(または最大)の配列要素を探し出す.
var collection = [
{ name: 'Douglas', age: 52, experience: 5 },
{ name: 'Karen', age: 36, experience: 22 },
{ name: 'Mark', age: 28, experience: 6 },
{ name: 'Richard', : age: 30, experience: 16 }
];
// Key
_.min(collection, 'age'),
// → { name: "Mark", age: 28, experience: 6 }
//
_.max(collection, function(item) {
return item.age + item.experience;
});
// → { name: "Karen", age: 36, experience: 22 }
3.7集合の偏平化と圧縮集合中のデータは入れ子構造の場合があり、それらを平準化する必要があります.いくつかの場合、セットの中の要素には無駄な値が含まれています.圧縮処理ができます.平準化と圧縮により,解析と実証のためにより,より洗練されたデータ構造を得ることができた.
// :
var collection = [
{ employer: 'Lodash', employees: [
{ name: 'Barbara' },
{ name: 'Patrick' },
{ name: 'Eugene' }
]},
{ employer: 'Backbone', employees: [
{ name: 'Patricia' },
{ name: 'Lillian' },
{ name: 'Jeremy' }
]},
{ employer: 'Underscore', employees: [
{ name: 'Timothy' },
{ name: 'Bruce' },
{ name: 'Fred' }
]} ];
//1、 .pluck Key value
// pluck , flatten
var employees = _.flatten(_.pluck(collection, 'employees'));
//2、
_.filter(employees, function(employee) {
return (/^[bp]/i).test(employee.name);
});
// →
// [
// { name: "Barbara" },
// { name: "Patrick" },
// { name: "Patricia" },
// { name: "Bruce" }
// ]
3.8識別部分または全部の集合要素some、every3.8.1_.そして私
someの役割は、集合中に要求に該当する属性があれば、trueに戻ります.そうでなければfalseに戻ります.
_.some([null, 0, 'yes', false], Boolean);
// → true
var users = [
{ 'user': 'barney', 'active': true },
{ 'user': 'fred', 'active': false }
];
// using the `_.matches` callback shorthand
_.some(users, { 'user': 'barney', 'active': false });
// → false
// using the `_.matchesProperty` callback shorthand
_.some(users, 'active', false);
// → true
// using the `_.property` callback shorthand
_.some(users, 'active');
// → true
3.8.2_.every_.everyは、集合中の各要素が含まれているかどうかを判断します.
var collection = [
{ name: 'Jonathan' },
{ first: 'Janet' },
{ name: 'Kevin' },
{ name: 'Ruby' }
];
if (!_.every(collection, 'name')) {
return ' name ; } // → " name "
lodash Collection小結:1、配列は集合に違いないので、すべてのCollecton方法は配列に適用されます.2、集合は必ずしも行列ではない.3、本節では、Map、reduce、reduceRightなど、少量のCollectionの方法は言及されていません.Map/Reduce編で紹介されます.