function ViewModel(columnsSource) { this.nextFileterBinaryConditions = ['AND', 'OR']; this.columns = ko.observableArray(columnsSource); this.filters = ko.observableArray([new Filter()]); this.addFilter = function(filterObj) { var invalidFilter = ko.utils.arrayFirst(this.filters(), function (filter) { return filter.IsValid() === false; }); if (invalidFilter == null) { var currentIndex = ko.utils.arrayIndexOf(this.filters(), filterObj); this.filters.splice(currentIndex + 1, 0, new Filter()); } }; this.removeFilter = function(filterObj) { this.filters.remove(filterObj); if (this.filters().length == 0) { this.addFilter(); } }; this.postFilters = function() { var items = ko.toJS(this.filters()); var mappedItems = ko.utils.arrayMap(items, function(filter) { delete filter.ColumnObj; delete filter.AvailableConditions; return filter; }); alert(ko.toJSON(mappedItems)); }; };