javascript学習ノート(3)--map&set&元素遍歴&filter
28099 ワード
JavaScriptのデフォルトのオブジェクト表示方式{}は他の言語のMapまたはDictionaryのデータ構造と見なすことができます.つまり、キーのセットは正しいですが、JavaScriptのオブジェクトには小さな問題があります.キーは文字列でなければなりません.しかし、実際にはNumberや他のデータタイプがキーとして使用されるのも非常に合理的です.この問題を解決するために、ES 6仕様は新しいデータタイプMapを導入しました.
for...ofサイクルとfor...inサイクルはどう違いますか?for...inサイクルは、歴史的なレガシー問題のため、実際にはオブジェクトの属性名(key)であるAray配列も実際にはオブジェクトであり、各要素のインデックスは属性として扱われています.Arayオブジェクトに手動で追加の属性を追加した後、for...inサイクルは予期せぬ効果をもたらします.
for…ofサイクルはこれらの問題を完全に修復し、それは自分の元素だけを集めて循環します.
例えば、一つのArayでは偶数を削除し、奇数だけ残します.
Arayの空の文字列を削除します.まず、trim関数trimを説明します.文字列の先頭のスペースを削除します.
しかし、時には、私達はすべてスペースと空の文字列だけを取り除きたいです.nullとundefiendはまだ使えます.
filterを利用して、Arayの重複要素indexOf()を除去して、前のセクションで先ほど話しました.指定された文字列または文字の出現位置を検索して、最初の値を返します.
var m = new Map([['Michael', 95], ['Bob', 75], ['Tracy', 85]]); // object
m.get('Michael'); // 95
var m = new Map(); // Map
m.set('Adam', 67); // key-value
m.set('Bob', 59);
m.has('Adam'); // key 'Adam': true
m.get('Adam'); // 67
m.delete('Adam'); // key 'Adam'
m.get('Adam'); // undefined
一つのキーは一つのvalueにしか対応できないので、一つのキーを何度もvalueに入れて、値を後の値に更新します.var m = new Map();
m.set('Adam', 67);
m.set('Adam', 88);
m.get('Adam'); //88
SetはMapと同様に、keyのセットでもありますが、valueは記憶されていません.keyは重複できないので、Setでは重複値がなく、重複要素はSetで自動的にフィルタリングされてセットを作成します.入力としてArayを提供する必要があります.あるいは直接に空セットを作成します.var s1 = new Set(); // Set
var s2 = new Set([1, 2, 3]); // 1, 2, 3
var s = new Set([1, 2, 3, 3, '3']);
s; // Set {1, 2, 3, "3"}"3" 3
add(key)法によりSetに要素を追加できます.繰り返し追加できますが、効果はありません. s.add(4)
s ;//{1, 2, 3, 4}
s.add(4)
s ;//{1, 2, 3, 4}
delete(key)方法で要素を削除できます.var s = new Set([1, 2, 3]);
s; // Set {1, 2, 3}
s.delete(3);
s; // Set {1, 2}
コンソールがエラー情報を返します.Error:Not a numberthrow 'Not a number'; //Error:Not a number
Arayは、下付きループを採用することができます.MapとSetを遍歴しても、下付き集合タイプのために使用できません.ES 6標準は、新しいiterableタイプを導入しました.Aray、Map、Setは、すべてiterableタイプの集合に属しています.新しいfor...ofサイクルでforを巡回します.使い方は以下の通りです.var a = ['A', 'B', 'C'];
var s = new Set(['A', 'B', 'C']);
var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
for (var x of a)
{ console.log(x); };//A B C
for (var x of s) {console.log(x); };//A B C
for (var x of m) {console.log(x[0] + '=' + x[1]); };//1=x 2=y3=z
Mapが遍歴している時、各Mapの要素は相当します.一つはKeyで、一つはValueで、x[0]とx[1]に対応しています.for...ofサイクルとfor...inサイクルはどう違いますか?for...inサイクルは、歴史的なレガシー問題のため、実際にはオブジェクトの属性名(key)であるAray配列も実際にはオブジェクトであり、各要素のインデックスは属性として扱われています.Arayオブジェクトに手動で追加の属性を追加した後、for...inサイクルは予期せぬ効果をもたらします.
var a = ['A', 'B', 'C'];
a.name="hello";
for (var x in a) { console.log(x); }0 1 2 name
for (var x in a) { console.log(a[x]); };//AB C hello
for…inサイクルはnameを含めますが、Arayのlength属性は含まれていませんので、for…inサイクルを使うと問題が発生する可能性があります.for…ofサイクルはこれらの問題を完全に修復し、それは自分の元素だけを集めて循環します.
var a = ['A', 'B', 'C'];
a.name = 'Hello';
for (var x of a) { console.log(x); };//A B C
より良い方法は、直接iterableに内蔵されたforEach方法を使用して、関数を受信し、反復ごとに自動的にこの関数をアラーを例に戻します.これは、arrayを構成するのがelement(要素自体)、index(インデックス)、array(配列オブジェクト)function()内の順序が要素、索引、配列、入力された変数名によって変更できます.(ここは理解しやすいだけです.)var a = ['A', 'B', 'C'];
a.forEach(function (element, index, array)
{
console.log(element);
});
A
B
C
a.forEach(function (element, index, array)
{
console.log(index);
});
0
1
2
a.forEach(function (element, index, array)
{
console.log(array);
});
Array(3) [ "A", "B", "C" ]
Array(3) [ "A", "B", "C" ]
Array(3) [ "A", "B", "C" ]
SetはArayと似ていますが、Setにはインデックスがありません.したがって、コールバック関数の最初の二つのパラメータは要素自体です.ここの変数名も同じです.みんなが理解しやすいだけで、変更できます. var s = new Set(['A', 'B', 'C']);
s.forEach(function (element, sameElement, set) { console.log(element); });
Mapのコールバック関数パラメータは、value、key、map自体となりますが、同じ変数名は分かりやすいだけです. var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
m.forEach(function (value, key, map) { console.log(value); });
いくつかのパラメータに興味がない場合、JavaScriptの関数呼び出しはパラメータが一致する必要がないので、それらを無視することができます.ただArayのelementを得る必要があります.var a = ['A', 'B', 'C'];
a.forEach(function (element) { console.log(element); })
filterも一般的な動作であり、Arayのいくつかの要素をフィルタリングして、残りの要素とmap()と同様にArayのfilter()も関数を受信して、map()とは違って、filter()は入力された関数を順番に各要素に作用して、帰り値によってtrueかfalseかによって、この要素を保留するかそれとも廃棄するかを決定します.例えば、一つのArayでは偶数を削除し、奇数だけ残します.
var arr = [1, 2, 4, 5, 6, 9, 10, 15];
var r = arr.filter(function (x) { return x % 2 !== 0; });
r;//Array(4) [ 1, 5, 9, 15 ]
arr;//Array(8) [ 1, 2, 4, 5, 6, 9, 10, 15 ]
x&2!==0がtrueに戻ると奇数となり、偶数ならfalseに戻りますが、arrは変わりません.Arayの空の文字列を削除します.まず、trim関数trimを説明します.文字列の先頭のスペースを削除します.
var str=" Noob ";
str.trim();//"Noob"
javascriptの中にはいくつかの先天的なfalseの常量null、undefined、'、''0があります.だから時々arrayの中に現れたら削除したいかもしれません.var arr = ['A', '', 'B', null, undefined, 'C', ' '];
var r = arr.filter(function (s) { return s});
r;//Array(4) [ "A", "B", "C", " " ] ,
また、上に出てくる5つはfalseで、具体的には違いがあります.""==false;//true
!null;//true
null==false;//false
!undefined;//true
undefined==false;//false
''==false;//true
0==false;//true
“”0は直接==falseですが、null、undefinedはfalseに等しくないです.彼らはまだ自分の意味があります.しかし、後はtrueに等しいです.いくつかの戻り値の中でfalseと等価になると考えられます.例えば、ここでは帰り値trueとfalseによって取捨選択します.盲目的に推測して実現する原理の中で逆を取る必要があります.でないと、undefinedとnullも同じです.私達は目を覚まして、その後nullとundeifnedを判断する時はやはり逆を取る必要があります.しかし、時には、私達はすべてスペースと空の文字列だけを取り除きたいです.nullとundefiendはまだ使えます.
var arr = ['A', '', 'B', null, undefined, 'C', ' '];
var r = arr.filter(function (s) { return String(s).trim(); });
r;//Array(5) [ "A", "B", null, undefined, "C" ]
ここでtoStringを使わないでください.nullとundefinedはtoStringという属性がないからです.String(null);//"null"
String(undefined);//"undefined"
filter()が受信したコールバック関数は、実際には複数のパラメータがあります.通常は最初のパラメータだけを使用して、Arayを表す要素コールバック関数は他の2つのパラメータも受信できます.要素の位置と配列自体を表します.var arr = ['A', 'B', 'C'];
var r = arr.filter(function (element, index, self) { console.log(element);
console.log(index);
console.log(self);
return true; });
A
0
Array(3) [ "A", "B", "C" ]
B
1
Array(3) [ "A", "B", "C" ]
C
2
Array(3) [ "A", "B", "C" ]
r
Array(3) [ "A", "B", "C" ]
各要素の順番に従って順次実行して、arrも繰り返し出力されました.上のForEachに似ていますが、後はreturnを加えます.filterの本職のためです.filterを利用して、Arayの重複要素indexOf()を除去して、前のセクションで先ほど話しました.指定された文字列または文字の出現位置を検索して、最初の値を返します.
var arr = ['apple', 'strawberry', 'banana', 'pear', 'apple', 'orange', 'orange', 'strawberry'];
var r = arr.filter(function (element, index, self) { return self.indexOf(element) === index; });
r
Array(5) [ "apple", "strawberry", "banana", "pear", "orange" ]
ここのindexOfは最初のインデックスだけを返すので、要素が最初に現れたときだけ残します.後に繰り返し出てくるものはフィルタにかけられます.