codice:
function (data,query) {
            var x = [];
            data.forEach(function(v){
                var a = v.tags;
                if(a) {
                    a.forEach(function (el) {
                        console.log(el)
                        if (query.test(el)) x.push(el)
                    });
                }
            });
            return arrayunique(x);
}
il codice è abbastanza autoesplicativo:
-data è un array di object che contengono un field "tags" (array di stringhe).
-"query" in input è regex

in output ho un array piano di tag che matchano la query (a prescindere dall'oggetto originale che li conteneva). Ovviamente arrayunique elimina i doppioni.
Non sono esperto, ma mi pare un caso estremamente semplice in cui si potrebbe usare un approccio map-reduce, quanto meno per rendere un pelo più elegante il codice (anche se mi pare di ricordare che map() di javascript è internamente mappato con for.. ).