JavaScriptとjQueryを用いた配列およびオブジェクトの結合手法

JavaScriptの開発において、複数のデータ構造(配列やオブジェクト)を一つにまとめる操作は頻繁に発生します。ここでは、jQueryのメソッドと標準的なJavaScriptの機能を活用した、効率的な結合およびコピーの手法について解説します。

1. 配列の結合

1.1 concatメソッドによる非破壊的な結合

concatメソッドは、既存の配列に他の配列や値を結合した新しい配列を返します。元の配列は変更されません。

const groupA = ["Tokyo", "Osaka"];
const groupB = ["Nagoya", "Fukuoka"];

const allCities = groupA.concat(groupB);

console.log(allCities); // ["Tokyo", "Osaka", "Nagoya", "Fukuoka"]
console.log(groupA);    // ["Tokyo", "Osaka"] (元の配列は維持される)

1.2 ループ処理による要素の追加

特定の条件に基づいた結合や、メモリ効率を考慮して既存の配列を直接拡張したい場合は、ループ処理を用います。

const primaryNumbers = [2, 3, 5];
const extraNumbers = [7, 11];

for (let i = 0; i < extraNumbers.length; i++) {
    primaryNumbers.push(extraNumbers[i]);
}

console.log(primaryNumbers); // [2, 3, 5, 7, 11]

1.3 applyメソッド(またはスプレッド構文)による一括追加

push.applyを使用すると、配列の要素を別の配列に一括で追加できます。現代のJavaScript環境では、スプレッド構文(...)を用いるのが一般的です。

const baseData = [100, 200];
const appendData = [300, 400];

// 従来の手法
Array.prototype.push.apply(baseData, appendData);

// もしくはスプレッド構文
// baseData.push(...appendData);

console.log(baseData); // [100, 200, 300, 400]

2. オブジェクトの結合

2.1 jQuery.extend() によるマージ

jQueryの$.extend()は、複数のオブジェクトを一つに統合する強力なメソッドです。

const settings = { theme: "dark" };
const options = { showSidebar: true };

// settingsオブジェクトが直接書き換えられる
$.extend(settings, options);
console.log(settings); // { theme: "dark", showSidebar: true }

// 新しいオブジェクトとして作成する場合
const newConfig = $.extend({}, settings, { version: "1.0" });
console.log(newConfig);

2.2 プロパティの反復代入

標準のループ処理を用いて、自有プロパティのみをコピーする方法です。hasOwnPropertyで継承されたプロパティを除外します。

const targetObj = { x: 10 };
const sourceObj = { y: 20, z: 30 };

for (let key in sourceObj) {
    if (sourceObj.hasOwnProperty(key)) {
        targetObj[key] = sourceObj[key];
    }
}
console.log(targetObj); // { x: 10, y: 20, z: 30 }

2.3 Object.assign() の活用

ES6以降では、Object.assign()を使用して複数のソースオブジェクトからターゲットオブジェクトへプロパティをコピーできます。

const userBase = { id: "user_01" };
const userProfile = { name: "Tanaka", age: 25 };
const userPermissions = { role: "admin" };

const fullUser = Object.assign(userBase, userProfile, userPermissions);

console.log(fullUser); // 全てのプロパティが統合される
console.log(userBase); // ターゲットとなったuserBaseも更新される

3. 浅いコピーと深いコピー(Shallow vs Deep Copy)

3.1 浅いコピー(Shallow Copy)

デフォルトの結合操作の多くは「浅いコピー」です。ネストされたオブジェクトが含まれる場合、参照情報のみがコピーされるため、コピー元の変更がコピー先にも影響します。

const original = { meta: { color: "red" } };
const shallowCopy = $.extend({}, original);

original.meta.color = "blue";
console.log(shallowCopy.meta.color); // "blue" (参照が同じため影響を受ける)

3.2 深いコピー(Deep Copy)

$.extend()の第一引数にtrueを渡すことで、再帰的にプロパティをコピーし、完全に独立した別個のオブジェクトを作成できます。

const source = { details: { status: "active" } };
const destination = {};

// 深いコピーを実行
$.extend(true, destination, source);

source.details.status = "inactive";
console.log(destination.details.status); // "active" (元の変更に影響されない)

タグ: jQuery javascript Array object deepcopy

5月26日 18:41 投稿