Hard to know what could be simplified without understanding what it does, but I would definitely recommend saving off jquery selectors as variables so you don't have to pay the DOM reading cost more than once. People often like to prefix such variables with $ to indicate that they are jquery objects, but this is really just preference. Also, never underestimate the importance of spacing.
var categoryFilter = $('.category-filter');
var articleContainer = $('.article-container');
categoryFilter.click(function() {
var category = $(this).attr('data-category');
categoryFilter.each(function() {
if ($(this).attr('data-category').indexOf(category) >= 0) {
$(this).removeClass('label-default').addClass('label-success').fadeIn('fast');
$(this).click(function() {
$(this).removeClass('label-success').addClass('label-default').fadeIn('fast');
articleContainer.each(function() { $(this).fadeIn('fast') })
categoryFilter.each(function() { $(this).fadeIn('fast') })
})
}
});
articleContainer.each(function() {
if (!($(this).attr('data-categories').indexOf(category) >= 0)) {
$(this).fadeOut('fast')
}
})
});
EDIT:
Having looked at this a bit more, I see a couple things you could simplify.
1) As @dandavis mentioned, you can create a named function for your fadeIn('fast') calls.
function fadeFast() {
$(this).fadeIn('fast');
}
2) You could also create a named function called swapClass to handle your removeClass().addClass() cases.
function swapClass(context, rm, add) {
return context.removeClass(rm).addClass(add);
}
Then invoke it like so:
swapClass($(this), 'label-default', 'label-success').fadeIn('fast');
But it really feels like that should actually be on the jquery instance (since you have to pass that in as the context), which you can do like this:
$.fn.swapClass = function(oldClass, newClass) {
return this.removeClass(oldClass).addClass(newClass);
};
Then invoke it like this:
$(this).swapClass('label-default', 'label-success').fadeIn('fast');
So that gets you to something like:
var categoryFilter = $('.category-filter');
var articleContainer = $('.article-container');
$.fn.swapClass = function(oldClass, newClass) {
return this.removeClass(oldClass).addClass(newClass);
};
function fadeFast() {
$(this).fadeIn('fast');
}
categoryFilter.click(function() {
var category = $(this).attr('data-category');
categoryFilter.each(function() {
var $this = $(this);
if ($this.attr('data-category').indexOf(category) >= 0) {
$this.swapClass('label-default', 'label-success').fadeIn('fast');
$this.click(function() {
$(this).swapClass('label-success', 'label-default').fadeIn('fast');
articleContainer.each(fadeFast);
categoryFilter.each(fadeFast);
})
}
});
articleContainer.each(function() {
var $this = $(this);
if (!($this.attr('data-categories').indexOf(category) >= 0)) {
$this.fadeOut('fast')
}
})
});
function() { $(this).fadeIn('fast') }asfadeFast, and calling it from above. if you got rid of all the anons, the code would be quite legible and logical.