bata's log

フロントエンド系のTipsとかメモ

JSONからデータを取得して配列にフィルターをかける

WEBアプリ開発でJSONデータを扱うことになったのでメモ。
実際に作り始めると色々な機能追加がありそうなので、対応出来るような書き方を目指してみた。

JavaScript

(function(window,namespace,$){

    function _Item(dataFilter,i,$_list){
        this.member_id = dataFilter[i].member_id;
        this.member_category = dataFilter[i].member_category;
        this.member_name = dataFilter[i].member_name;
        this.item_id = dataFilter[i].item_id;
        this.item_name = dataFilter[i].item_name;
        this.item_src = dataFilter[i].item_src;
        this.addList($_list);
    }

    _Item.prototype.addList = function($_list){
        $_list.append(
            '<li>'
            + '<span>' + this.member_id + '</span>'
            + '<span>' + this.member_name + '</span>'
            + '<span>' + this.member_category + '</span>'
            + '<span>' + this.item_id + '</span>'
            + '<span>' + this.item_name + '</span>'
            + '<span>' + this.item_src + '</span>'
            + '</li>'
        );
    }

    window[namespace] = {

        init: function(json){
            var data = json;
            this.getDataAll(data);
            this.change(data);
        },

        change: function(data){
            var that = this;

            $('input:text').on('change',function(){
                var value = $(this).val();
                _case(data,'member_name',value);
            })

            $('select').on('change',function(){
                var value = $(this).val();
                _case(data,'member_category',value);
            })

            function _case(data,subject,value){
                if(value == 'all'){
                    that.getDataAll(data);
                }else{
                    that.getDataFilter(data,value,subject);
                }
            }
        },

        getDataAll: function(data){
            var dataFilter = data;
            this.display(dataFilter);
        },

        getDataFilter: function(data,value,subject){
            var dataAll = data;
            var dataFilter = [];
            var str = new RegExp(value,'i');
            dataFilter = dataAll.filter(function(item,index){
                if(item[subject].match(str)){
                    return true;
                };
            });
            this.display(dataFilter);
        },

        display: function(dataFilter){
            var len = dataFilter.length;
            var $_list = $('#list');
            $_list.empty();
            for (var i = 0; i < len; i++) {
                new _Item(dataFilter,i,$_list);
            };
        }
    }

})(this,'DataBind',jQuery);

JSONを読込む

$(function(){
    $.ajax({
        url: '/inc/data/data.json',
        type: 'GET',
        cache: false,
        dataType: 'json',
        success: function(json){
            DataBind.init(json);
        }
    });
});

実行するとこんな感じ

※HTMLその他のソースは上記参照