JavaScriptのオブジェクト操作まとめ
今回はJavaScriptのオブジェクト操作について。これのループ処理が順序不定になるのでよく戸惑います。(^-^;
定義
let object = { 1: "A", 3: "B", 5: "C", 2: "BB", 4: "B" };
console.log(object[2]); // BB
console.log(object); // { '1': 'A', '2': 'BB', '3': 'B', '4': 'B', '5': 'C' }
要素数を取得
Object.keys()
メソッドでキー(メンバ名)の配列を取得し、length
で数を取得します。
let object = { 1: "A", 3: "B", 5: "C", 2: "BB", 4: "B" };
console.log(Object.keys(object).length); // 5
ループ
for...in 文
順序不定でキー(メンバ名)を取得します。
let object = { 1: "A", 3: "B", 5: "C", 2: "BB", 4: "B" };
for (let key in object) {
console.log("%s: %s", key, object[key]);
}
> 1: A
> 2: BB
> 3: B
> 4: B
> 5: C
for...of 文
順序不定で要素を取得します。
let object = { 1: "A", 3: "B", 5: "C", 2: "BB", 4: "B" };
// キーを取得.
for (let key of Object.keys(object)) {
console.log(key);
}
// 値を取得.
for (let value of Object.values(object)) {
console.log(value);
}
// キーと値を取得.
for (let [key, value] of Object.entries(object)) {
console.log("%s: %s", key, value);
}
> 1
> 2
> 3
> 4
> 5
> A
> BB
> B
> B
> C
> 1: A
> 2: BB
> 3: B
> 4: B
> 5: C
forEach() メソッド
順序不定でキー(メンバ名)を取得し、キー(メンバ名)を元に関数を実行します。
let object = { 1: "A", 3: "B", 5: "C", 2: "BB", 4: "B" };
Object.keys(object).forEach(function(key) {
console.log("%s: %s", key, object[key]);
});
> 1: A
> 2: BB
> 3: B
> 4: B
> 5: C
プロパティの追加
キー(メンバ名)を指定して追加します。既にあるキー(メンバ名)を指定した場合は値の変更になります。
let object = { 1: "A", 3: "B", 5: "C", 2: "BB", 4: "B" };
object[10] = "Z";
console.log(object); // { '1': 'A', '2': 'BB', '3': 'B', '4': 'B', '5': 'C', '10': 'Z' }
object[4] = "D";
console.log(object); // { '1': 'A', '2': 'BB', '3': 'B', '4': 'D', '5': 'C', '10': 'Z' }
object.a = "ABC";
console.log(object["a"]); // ABC
プロパティの削除
delete
を使用します。
let object = { 1: "A", 3: "B", 5: "C", 2: "BB", 4: "B" };
delete object[1];
console.log(object); // { '2': 'BB', '3': 'B', '4': 'B', '5': 'C' }
プロパティの確認
in
演算子を使うと指定されたプロパティがオブジェクトに存在するかチェックできます。
プロパティ名は文字列で指定する必要があります。(下記でyear in object
だとエラーになる)
ただし、数値の場合はそのままでも判定できます。
const object = { year: '2021', month: '01', 1: 'one' };
console.log(object.year); // 2021
console.log('year' in object); // true
console.log(object.day); // undefined
console.log('day' in object); // false
console.log(1 in object); // true
console.log('1' in object); // true
in
演算子は指定されたプロパティがオブジェクトに存在するかどうかを判定するため、その値がfalse
やnull
でもtrue
を返します。
値がfalse
やnull
の場合も含めて判定したい場合は、オブジェクト.プロパティ名
やオブジェクト[プロパティ名]
で判定します。
const json = { result1: false, result2: null };
console.log('result1' in json);
console.log(json.result1);
console.log(json['result1']);
if (json.result1) {
console.log(`json.result1 value is ${json.result1}`);
}
console.log('result2' in json);
console.log(json.result2);
console.log(json['result2']);
if (json.result2) {
console.log(`json.result2 value is ${json.result2}`);
}
console.log('result3' in json);
console.log(json.result3);
console.log(json['result3']);
if (json.result3) {
console.log(`json.result3 value is ${json.result3}`);
}
> true
> false
> false
> true
> null
> null
> false
> undefined
> undefined
判定例2
const json = { 12221: [], 12222: ['a'], 12224: false, 12225: false };
if (json['12221']) {
console.log('12221');
}
if (json['12222']) {
console.log('12222');
}
// プロパティがないので通らない.
if (json['12223']) {
console.log('12223');
}
// プロパティはあるが、値が false なので通らない.
if (json['12224']) {
console.log('12224');
}
// プロパティがあるので、値に関係なく通る.
if ('12225' in json) {
console.log('12225');
}
> "12221"
> "12222"
> "12225"