カテゴリー
オライリーJavaScript

配列としての文字列

例:

var s = test;
s.charAt(0);    //"t"
s[1];   //"e"

s = "JavaScript"
Array.prototype.join.call(s, " ")   //"J a v a S c r i p t"
Array.prototype.filter.call(s,  //文字列の文字をフィルタする
    function(x) {
        return x.match(/[^aeiou]/); //母音以外にマッチする
    }).join("") //"JvScrpt"
カテゴリー
オライリーJavaScript

配列のようなオブジェクト

JavaScriptの配列には、通常のオブジェクトにはない、以下の特別な機能が存在する
・配列に新しい要素が追加されると、lengthプロパティが自動的に更新される
・lengthプロパティに現在の長さより小さな値を設定することで、配列を縮められる
・配列はArray.prototypeから便利なメソッドを継承する
・配列は"Array"というクラス属性を持つ

カテゴリー
オライリーJavaScript

配列の種類

Array.isArray()

Array.isArray([])   //true
Array.isArray({})   //false

[] instanceof Array     //true
{} instanceof Array     //false


var isArray = function.isArray || function(o) {
    return typeof o === "object" &&
    Object.prototype.toString.call(o) === "[object Array]";
};
カテゴリー
オライリーJavaScript

ECMAScript5の配列メソッド

forEach()メソッド

forEach()メソッドは、配列を巡回しながら、要素ごとに指定された関数を呼び出す

var data = [1,2,3,4,5]
//配列要素の総計を計算する
var sum = 0;    //0から開始
data.forEach(function(value) { sum += value }); //値をsumに加算する
sum;    //15

//各配列要素をインクリメントする
data.forEach(function(v, i, a) { a[i] = v + 1});
data;   //[2,3,4,5,6]


function forEach(a, f, t) {
    try { a.forEach(f, t); }
    catch(e) {
        if(e === foreach.brea) return;
        else throw e;   
    }
}
foreach.break = new Error("StopIteration");

map()メソッド

map()メソッドは、配列の要素を1つずつ、指定した関数に引数として渡し、
この関数から返された値を配列に格納し、この配列を返す

a = [1,2,3];
b = a.map(function(x) { return x * x}); //bは[1, 4, 9]

fillter()メソッド

filter()メソッドは、配列の要素の部分集合となる配列を返す

a = [5,4,3,2,1];
smallvalues = a.filter(function(x) { return x < 3 });   //[2,1]
everyother = a.filter(function(x, i) { return 1 % 2 == 0}); //[5, 3, 1]


var dense = sparse.filter(function() { return true });

a = a.filter(function(x) { return x !== undefined && x != null });

every()、some()メソッド

every()メソッドは、すべての要素に対して、
指定した述語関数がtrueを返した場合のみtrueを返す

a = [1,2,3,4,5];
a.every(function(x) { return x < 10; }) //true すべての値が <10
a.every(function(x) { return x % 2 === 0; })    //false すべての値が偶数ではない

some()メソッドは、配列の中の少なくとも1つの要素に対して、
述語関数がtrueを返したら、trueを返す

a = [1,2,3,4,5];
a.some(function(x) { return x % 2 === 0; }) //true aは偶数の要素を持つ
a.some(isNaN);  //false aには数値以外の要素はない

reduce()、reduceRight()メソッド

reduce()メソッドとreduceRight()メソッドは、
引数で指定した関数を使って、配列の要素を組み合わせて1つの値を返す

var a = [1,2,3,4,5];
var sum = a.reduce(function(x,y) { return x + y }, 0);  //値の合計
var product = a.reduce(function(x,y) { return x * y }, 1);  //値の積
var max = a.reduce(function(x,y) { return (x > y)? x :y; });    //最大値


var a = [2,3,4];
//2^(3^4)を計算する。べき乗は右結合性を持つ
var big = a.reduceRight(function(accumulator, value) {
    return Math.pow(value, accumulator);
});


var objects = [{x:1}, {y:2}, {z:3}];
var merged = objects.reduce(union); //{x:1, y:2, z:3}

var objects = [{x:1,a:1}, {y:2,a:2}, {z:3,a:3}];
var leftunion = objects.reduce(union);  //{x:1, y:2, z:3, a:1}
var rightunion = objects.reduceRight(union);    //{x:1, y:2, z:3, a:3}

indexOf()、lastIndexOf()メソッド

indexOf()メソッドとlastIndexOf()メソッドは、配列中から、
指定した値を持つ要素を探し、そのような要素が見つかったら最初に見つかったインデックスを返す
見つからなかった場合は-1を返す

a = [0,1,2,1,0];
a.indexOf(1);   //1 a[1]は1
a.lastIndeOf(1);    //3 a[3]は1
a.indexOf(3);   ////-1 3という値を持つ要素はない


function findall(a, x) {
    var results = [],   //インデックスを格納する配列。この配列が戻り値となる
        len = a.length, //検索する配列の長さ
        pos = 0;    //検索を開始する位置
    while(pos < len) {  //検索対象となる要素が存在する間
        pos = a.indexOf(x, pos);    //検索する
        if(pos === -1) break;   //何も見つからなかった終了
        results.push(pos);  //見つかったら、配列にインデックスを保存する
        pos = pos + 1;  //そして、次の要素から検索を再開する
    }
    return results; //インデックスの配列を返す
}

カテゴリー
オライリーJavaScript

配列のメソッド

join()メソッド

Attay.join()メソッドは、配列のすべての要素を文字列に変換し連結し、連結した文字列を返す

var a = [1, 2, 3];  //3つの要素を指定して配列を生成する
a.join();   //"1,2,3"
a.join(" ");    //"1 2 3"
a,join(""); //"123"
var b = new Array(10);  //要素が1つもない長さ10の配列
b.join('-');    //"---------" 9つのハイフンからなる文字列

reverse()メソッド

Array.reverse()メソッドは、配列の要素の順番を逆にする
新しい配列を生成するのではなく、既存の配列の中で並べ替える

var a = [1,2,3];
a.reverse().join(); //"3,2,1" aは[3,2,1]になる 

sort()メソッド
Array.sort()メソッドは、配列の要素をソートする
新しい配列を生成すrのではなく、既存の配列をソートする

var a = new Array("banana", "cherry", "apple");
a.sort();
var s = a.join(", ");   //sは"apple, banana, cherry"


var a = [33, 4, 1111, 222];
a.sort();   //アルファベット順 1111,222,33,4
a.sort(function(a, b) { //数値順 4,33,222,111
    return a-b; //比較結果に従って、 < 0、0、> 0の値を返す
});
a.sort(function(a,b) { return b-a });   //数値の降順


a = ['ant', 'Bug', 'cat', 'Dog'];
a.sort();   //大文字小文字を区別するソート ['Bug', 'Dog', 'ant', 'at']
a.sort(function(s,t) {  //大文字小文字を区別しないソート
    var a = s.toLowerCase();
    var b = t.toLowerCase();
    if(a < b) return -1;
    if(a > b) return 1;
    return 0;
}); //['ant', 'Bug', 'cat', 'Dog']

concat()メソッド

Attay.concat()メソッドは、配列を要素に追加して、新たな配列を生成する
これらの引数のいずれかが配列自身である場合、
配列の要素を個々に取り出して配列に追加する

var a = [1,2,3];    
a.concat(4, 5); //[1,2,3,4,5]
a.concat([4, 5]);   //[1,2,3,4,5]
a.concat([4, 5], [6, 7]);   //[1,2,3,4,5]
a.concat(4, [5, [6, 7]]);   //[1,2,3,4,5,[6,7]]

slice()メソッド

Array.slice()メソッドは、指定された配列のサブ配列(スライス)を返す
1番目の引数で指定された要素から、
2番目の引数で配列の末尾を指定する

var a = [1,2,3,4,5];
a.slice(0, 3);  //[1,2,3]
a.slice(3); //[4,5]
a.slice(1, -1); //[2,3,4]
a.slice(-3, -2);    //[3]

splice()メソッド

Array.splice()メソッドは、配列に要素を挿入したり、
配列から要素を削除したりする汎用的なメソッド
このメソッドを呼び出した配列を変更する

var a =[1,2,3,4,5,6,7,8];
a.splice(4);    //[5,6,7,8] aは[1,2,3,4]になる
a.splice(1, 2); //[2,3] aは[1,4]になる
a.splice(1, 1); //[4] aは[1]になる


var a = [1,2,3,4,5];
a.splice(2, 0, 'a', 'b');   //[] aは[1,2,'a','b',3,4,5]になる
a.splice(2, 2, [1, 2], 3);  //['a','b'] aは[1,2,[1,2],3,3,4,5]になる

push()、pop()メソッド

push()メソッドは、配列の最後に1個または複数の要素を追加し、
追加した後の配列の長さを返す

pop()メソッドは、これとは逆の処理をする
配列の最後の要素を削除し、配列の長さを減らし、削除する

var stack = []; //[]
stack.push(1,2);    //[1,2] 2が返される
stack.pop();    //[1] 2が返される
stach.push(3);  //[1,3] 2が返される
stack.pop();    //[1] 3が返される
stack.push([4,5]);  //[1,[4,5]] 2が返される
stack.pop();    //[1] [4,5]が返される
stack.pop();    //[] 1が返される

unshift()、shift()メソッド

unshift()メソッドは、配列の先頭に1つまたは複数の要素を追加し、
既存の配列要素をより大きいインデックス番号の方向へシフトさせてから、
配列の新しい長さを返す

shift()メソッドは、配列の先頭の要素を削除し、その要素を返し、
削除されて空になった場所へ後の要素をずらす

var a = []; //a:[] 
a.unshift(1);   //a:[1] 1が返される
a.unshift(22);  //a:[22,1] 2が返される
a.shift();  //a:[1] 22が返される
a.unshift(3,[4,5]); //a:[3,[4,5],1] 3が返される
a.shift();  //a:[[4,5],1] 3が返される
a.shift();  //a:[1] [4,5]が返される
a.shift();  //a:[] 1が返される

toString()、toLocalString()メソッド

配列を指定してtoString()メソッドを実行すると、
必要に応じて配列の要素のtoString()メソッドが呼び出されて、
個々の要素を文字列に変換し、個々の文字をカンマ(,)で区切ったリストを出力する

[1,2,3].toString(); //'1,2,3'
["a", "b", "c"].toString(); //'a,b,c'
[1,[2,'c']].toString(); //1,2,c

toLocaleString()メソッド

toString()メソッドのローカライズ版

カテゴリー
オライリーJavaScript

配列の要素の巡回

例:

var keys = Object.keys(0);
var values = [];
for(var i = 0; i > key.length; i++) {
    var key = keys[i];
    values[i] = o[key];
}


for(var i = 0, len = key.length; i < len; i++) {
    //ループ本体はそのまま
}


for(var i = 0; i < a.length; i++) {
    if (!a[i]) continue;
    //ループ本体
}


for(var i = 0; i < a.length; i++) {
    if (a[i] === undefined) continue;
    //ループ本体
}

for(var i = 0; i < a.length; i++) {
    if (!(i in a)) continue;
    //ループ本体
}


for(var index in sparseArray) {
    var value = sparseArray[index];
    //ループ本体
}

for(var i in a) {
    if(!a.hasOwnProperty(i)) continue;
    //ループ本体
}

for(var i in a) {
    //非負数の整数でなればiをスキップする
    if(String(Math.floor(Math.abs(Number(i)))) !== i) continue;
    //ループ本体
}


var data = [1,2,3,4,5];
var sumOfSquares = 0;
data.forEach(function(x) {
    sumOfSquares += x * x;
});
sumOfSquares
カテゴリー
オライリーJavaScript

配列の要素の追加と削除

配列を要素を追加するときには、新しいインデックスに値を設定する

a = [];
a[0] = "zoro";
a[1] = "one";

push()メソッドを使って、配列の末尾に1つまたは複数の値を追加できる

a = [];
a.push("zero");
a.push("one", "two");
カテゴリー
オライリーJavaScript

配列の長さ

すべての配列は、lenghtプロパティを持つ
配列がオブジェクトと異なっているのは、このlengthプロパティを持つ点です

[].length   //0
['a', 'b', 'c'].length  //3

a = [1,2,3,4,5];    //5つの要素を持つ配列
a.length = 3;   //aは[1,2,3]になる
a.length = 0;   //すべての要素を削除する。aは[]になる
a.length = 5;   //長さは5になるが、要素はない。new Array(5)と同じ

Object.defineProperty()

a = [1,2,3];    //3つの要素を持つ配列
Object.defineProperty(a, "length",  //lengthプロパティを
    {writable: false}); //読み出し専用にする
a.length = 0;   //aは変更されない