Angular.jsでオブジェクトのコピー・上書き・比較をしてみます。
copy
copyはオブジェクトをディープコピーします。
HTML
<div ng-controller="ctrl"> <div class="button"> <button ng-hide="flag" ng-click="add()">データ変更</button> </div> </div>
JavaScript
angular.module('app', []).controller('ctrl', function($scope) { var data1 = { 'leader': 'マナト', 'member': [ { 'name': 'ハルヒロ', 'class': '盗賊' }, { 'name': 'ランタ', 'class': '暗黒騎士' }, { 'name': 'マナト', 'class': '神官' }, { 'name': 'モグゾー', 'class': '戦士' }, { 'name': 'ユメ', 'class': '狩人' }, { 'name': 'シホル', 'class': '魔法使い' } ] }; // data2にdata1をディープコピー var data2 = angular.copy(data1); // データ変更前の値 console.log(data1); console.log(data2); // データ変更の処理 $scope.flag = false; $scope.add = function() { // data1の値を変更する data1['member'].splice(2,1); data1['leader'] = 'ハルヒロ'; data1['member'].push({ 'name': 'メリイ', 'class': '神官' }) data1['member'].splice(2,1); data1['member'].push({ 'name': 'クザク', 'class': '聖騎士' }) // データ変更後の値 console.log(data1); console.log(data2); $scope.flag = true; } });
ディープコピーを行うため、コピー元を変更してもコピー先は変更されません。
また、$scopeのオブジェクトのコピーはできません。
copyのデモページ
extend
extendは別のオブジェクトから要素を追加(上書き)します。
HTML
<div ng-controller="ctrl"> <div class="button"> <button ng-hide="flag" ng-click="add()">データ変更</button> </div> </div>
JavaScript
angular.module('app', []).controller('ctrl', function($scope) { var data1 = { 'leader': 'マナト', 'member': [ { 'name': 'ハルヒロ', 'class': '盗賊' }, { 'name': 'ランタ', 'class': '暗黒騎士' }, { 'name': 'マナト', 'class': '神官' }, { 'name': 'モグゾー', 'class': '戦士' }, { 'name': 'ユメ', 'class': '狩人' }, { 'name': 'シホル', 'class': '魔法使い' } ] }; // 上書きするデータ1 var data2 = { 'leader': 'ハルヒロ', 'member': [ { 'name': 'ハルヒロ', 'class': '盗賊' }, { 'name': 'ランタ', 'class': '暗黒騎士' }, { 'name': 'モグゾー', 'class': '戦士' }, { 'name': 'ユメ', 'class': '狩人' }, { 'name': 'シホル', 'class': '魔法使い' }, { 'name': 'メリイ', 'class': '神官' } ] }; // 上書きするデータ2 var data3 = { 'member': [ { 'name': 'ハルヒロ', 'class': '盗賊' }, { 'name': 'ランタ', 'class': '暗黒騎士' }, { 'name': 'ユメ', 'class': '狩人' }, { 'name': 'シホル', 'class': '魔法使い' }, { 'name': 'メリイ', 'class': '神官' }, { 'name': 'クザク', 'class': '聖騎士' } ] }; // 上書き前の値 console.log(data1); // データ上書きの処理 $scope.flag = false; $scope.add = function(index) { // data1にdata2,data3の値を上書きする angular.extend(data1, data2, data3); // 上書き後の値 console.log(data1); $scope.flag = true; } });
既にある要素の場合は値が上書きされ、ない場合は追加されます。
extendのデモページ
equals
equalsはオブジェクトを比較して、一致するかどうかでtrue/falseを返します。
HTML
<div ng-controller="ctrl"> </div>
JavaScript
angular.module('app', []).controller('ctrl', function($scope) { var data1 = { 'leader': 'マナト', 'member': [ { 'name': 'ハルヒロ', 'class': '盗賊' }, { 'name': 'ランタ', 'class': '暗黒騎士' }, { 'name': 'マナト', 'class': '神官' }, { 'name': 'モグゾー', 'class': '戦士' }, { 'name': 'ユメ', 'class': '狩人' }, { 'name': 'シホル', 'class': '魔法使い' } ] }; var data2 = { 'leader': 'ハルヒロ', 'member': [ { 'name': 'ハルヒロ', 'class': '盗賊' }, { 'name': 'ランタ', 'class': '暗黒騎士' }, { 'name': 'ユメ', 'class': '狩人' }, { 'name': 'シホル', 'class': '魔法使い' }, { 'name': 'メリイ', 'class': '神官' }, { 'name': 'クザク', 'class': '聖騎士' } ] }; var data3 = { 'leader': 'ハルヒロ', 'member': [ { 'name': 'クザク', 'class': '聖騎士' }, { 'name': 'ランタ', 'class': '暗黒騎士' }, { 'name': 'ハルヒロ', 'class': '盗賊' }, { 'name': 'ユメ', 'class': '狩人' }, { 'name': 'シホル', 'class': '魔法使い' }, { 'name': 'メリイ', 'class': '神官' } ] }; var data4 = { 'leader': 'ハルヒロ', 'member': [ { 'class': '聖騎士', 'name': 'クザク' }, { 'class': '暗黒騎士', 'name': 'ランタ' }, { 'class': '盗賊', 'name': 'ハルヒロ' }, { 'class': '狩人', 'name': 'ユメ' }, { 'class': '魔法使い', 'name': 'シホル' }, { 'class': '神官', 'name': 'メリイ' } ] }; // データの比較 console.log(angular.equals(data1, data2)); // 中身が異なる console.log(angular.equals(data2, data3)); // 配列内の順番が異なる console.log(angular.equals(data3, data4)); // オブジェクトの順番が異なる });
連想配列の場合、要素の順番が異なっても同じオブジェクトであると判断されます。。
また、$scopeのオブジェクトの比較はできません。
equalsのデモページ
コメントが承認されるまで時間がかかります。