19444


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

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

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

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

[code]

    $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('エラー');
              });
    
[/code]

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

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

[code]

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

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


CC BY-SA 3.0
2015-11-28T05:14:55.317
19391
2015-11-30T04:50:30.157
13163
question
javascript angularjs
json データの配列から、特定のデータを取得（検索）したい


AngularJSだから可能なスマートな書き方、というのはあまりなさそうですがunderscore.jsを使うのが問題なければこういう感じで一行にできます。

[code]

    $scope.account_branch = _.find(data, function(d) { return d.id === 110545; });
    
[/code]

存在しなかった時の処理はここでは省いています。


CC BY-SA 3.0
2015-11-29T01:11:04.617
19423
2015-11-29T01:11:04.617
13444
19391
answer


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

[/ API Reference / ng / filter components in ng /
filter](https://docs.angularjs.org/api/ng/filter/filter)

[code]

    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);
        }
    }]);
    
[/code]


CC BY-SA 3.0
2015-11-29T15:43:23.353
19444
2015-11-30T04:50:30.157
2015-11-30T04:50:30.157
9566
9566
19391
answer


angularjsのhttpモジュールに詳しくないのですがdataがjavascriptの配列であれば  
外部ライブラリなしでjavascriptのfilterが使えます。

(IE9以降らしいです
<https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter>)

[code]

    .success(function(data,status,headers,config)) {
      $scope.account_branch = data.filter(function(branch) {
          return branch.id === 110545;
      });
    }).error(...);
    
[/code]


CC BY-SA 3.0
2015-11-29T23:36:16.793
19448
2015-11-29T23:36:16.793
13451
19391
answer