json データの配列から、特定のデータを取得(検索)したい

投稿者: Anonymous

Rails アプリで、ユーザの口座情報を入力・編集する機能を作成しています。

その際に『銀行を変更したら支店一覧を更新する』処理を angularjs を使って
書いているのですが、登録済みデータ(A銀行 aa支店)を変更する画面で

  1. A銀行の支店一覧を ajax で取得
  2. 支店一覧から aa 支店を選択済みに設定

する際のコードで悩んでいます。今のコードは下のようになっています。

$http.get('/banks/' + $scope.account_bank + '/branches.json'
          ).success(function(data, status, headers, config) {
            $scope.account_branches = data;
            $scope.account_branch   = data[0];
            if (11 == $scope.account_bank) {
              for (var i = 0; i < data.length; i++) {
                value = data[i];
                if (value.id == 110545) {
                  $scope.account_branch = value;
                  break;
                }
              }
            }
          }).error(function(data, status, headers, config) {
            $scope.account_branches = [];
            alert('エラー');
          });

※ コード中の ’11’ は Rails アプリでの銀行データのID, ‘110545’ は同じく支店データの ID です。

なお、コード中の data(支店一覧)は以下のような内容になっています。

[{"id":1,"code":359,"name":"綱島支店","kana":"ツナシマシテン"},
 {"id":2,"code":556,"name":"日吉支店","kana":"ヒヨシシテン"}]

勿論 for ループを使ったこのコードでも目的は達しているのですが、折角 angularjs を使っているのでもっとエレガント(?)なコードが無いものかと悩んでいます。ご教示頂ければ幸いです。

解決

フィルターを使えばよいかと思います。
下記の例では、id1のみ引き当たり、11は引き当たらないはずです。
配列で返ってくるので、その点は注意が必要です。

/ API Reference / ng / filter components in ng / filter

app.controller("testController", ["$scope", "$filter", function($scope, $filter) {
    var data = [
        {"id":1,"code":359,"name":"綱島支店","kana":"ツナシマシテン"},
        {"id":2,"code":556,"name":"日吉支店","kana":"ヒヨシシテン"},
        {"id":11,"code":1,"name":"東京営業部","kana":"トウキョウエイギョウブ"},
    ];
    $scope.account_branch = {};
    var result = $filter("filter")(data, { id: 1 }, true);
    if (result.length > 0) {
        $scope.account_branch = result[0];
        console.log($scope.account_branch.code);
        console.log($scope.account_branch.name);
        console.log($scope.account_branch.kana);
    }
}]);
回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *