Reputation: 177
Say this is my data, how could I use Underscore to filter the data to only keep the nested part by tax_rank, but keep the object structure?
I am trying to create a heatmap that when you choose from a drop down it re-draws the heatmap by tax_rank. I am new to Underscore and the .filter .pluck and .map utilities look very helpful but I can not seem to get the chaining correct.
let data = [
{
"sample_date": "2017-07-04T00:00:00.000Z",
"ubiome": [
{
"taxon": 817,
"parent": 816,
"count": 72,
"count_norm": 1283,
"tax_name": "Bacteroides fragilis",
"tax_rank": "species"
},
{
"taxon": 818,
"parent": 816,
"count": 208,
"count_norm": 3708,
"tax_name": "Bacteroides thetaiotaomicron",
"tax_rank": "species"
},
{
"taxon": 820,
"parent": 816,
"count": 41,
"count_norm": 731,
"tax_name": "Bacteroides uniformis",
"tax_rank": "species"
},
{
"taxon": 821,
"parent": 816,
"count": 3490,
"count_norm": 62226,
"tax_name": "Bacteroides vulgatus",
"tax_rank": "species"
},
{
"taxon": 823,
"parent": 375288,
"count": 120,
"count_norm": 2139,
"tax_name": "Parabacteroides distasonis",
"tax_rank": "species"
},
{
"taxon": 832,
"parent": 204431,
"count": 12,
"count_norm": 213,
"tax_name": "Fibrobacter",
"tax_rank": "genus"
},
{
"taxon": 841,
"parent": 186803,
"count": 1285,
"count_norm": 22911,
"tax_name": "Roseburia",
"tax_rank": "genus"
},
{
"taxon": 842,
"parent": 841,
"count": 11,
"count_norm": 196,
"tax_name": "Roseburia cecicola",
"tax_rank": "species"
},
{
"taxon": 853,
"parent": 216851,
"count": 7853,
"count_norm": 140019,
"tax_name": "Faecalibacterium prausnitzii",
"tax_rank": "species"
},
{
"taxon": 976,
"parent": 68336,
"count": 26028,
"count_norm": 464081,
"tax_name": "Bacteroidetes",
"tax_rank": "phylum"
}
]
},
{
"sample_date": "2017-07-04T00:00:00.000Z",
"ubiome": [
{
"taxon": 817,
"parent": 816,
"count": 72,
"count_norm": 1283,
"tax_name": "Bacteroides fragilis",
"tax_rank": "species"
},
{
"taxon": 818,
"parent": 816,
"count": 208,
"count_norm": 3708,
"tax_name": "Bacteroides thetaiotaomicron",
"tax_rank": "species"
},
{
"taxon": 820,
"parent": 816,
"count": 41,
"count_norm": 731,
"tax_name": "Bacteroides uniformis",
"tax_rank": "species"
},
{
"taxon": 821,
"parent": 816,
"count": 3490,
"count_norm": 62226,
"tax_name": "Bacteroides vulgatus",
"tax_rank": "species"
},
{
"taxon": 823,
"parent": 375288,
"count": 120,
"count_norm": 2139,
"tax_name": "Parabacteroides distasonis",
"tax_rank": "species"
},
{
"taxon": 832,
"parent": 204431,
"count": 12,
"count_norm": 213,
"tax_name": "Fibrobacter",
"tax_rank": "genus"
},
{
"taxon": 841,
"parent": 186803,
"count": 1285,
"count_norm": 22911,
"tax_name": "Roseburia",
"tax_rank": "genus"
},
{
"taxon": 842,
"parent": 841,
"count": 11,
"count_norm": 196,
"tax_name": "Roseburia cecicola",
"tax_rank": "species"
},
{
"taxon": 853,
"parent": 216851,
"count": 7853,
"count_norm": 140019,
"tax_name": "Faecalibacterium prausnitzii",
"tax_rank": "species"
},
{
"taxon": 976,
"parent": 68336,
"count": 26028,
"count_norm": 464081,
"tax_name": "Bacteroidetes",
"tax_rank": "phylum"
}
]
}]
Here is what I am hoping to achieve if the filter parameter was tax_rank = species:
let data = [
{
"sample_date": "2017-07-04T00:00:00.000Z",
"ubiome": [
{
"taxon": 817,
"parent": 816,
"count": 72,
"count_norm": 1283,
"tax_name": "Bacteroides fragilis",
"tax_rank": "species"
},
{
"taxon": 818,
"parent": 816,
"count": 208,
"count_norm": 3708,
"tax_name": "Bacteroides thetaiotaomicron",
"tax_rank": "species"
},
{
"taxon": 820,
"parent": 816,
"count": 41,
"count_norm": 731,
"tax_name": "Bacteroides uniformis",
"tax_rank": "species"
},
{
"taxon": 821,
"parent": 816,
"count": 3490,
"count_norm": 62226,
"tax_name": "Bacteroides vulgatus",
"tax_rank": "species"
},
{
"taxon": 823,
"parent": 375288,
"count": 120,
"count_norm": 2139,
"tax_name": "Parabacteroides distasonis",
"tax_rank": "species"
},
{
"taxon": 842,
"parent": 841,
"count": 11,
"count_norm": 196,
"tax_name": "Roseburia cecicola",
"tax_rank": "species"
},
{
"taxon": 853,
"parent": 216851,
"count": 7853,
"count_norm": 140019,
"tax_name": "Faecalibacterium prausnitzii",
"tax_rank": "species"
}
]
},
{
"sample_date": "2017-07-04T00:00:00.000Z",
"ubiome": [
{
"taxon": 817,
"parent": 816,
"count": 72,
"count_norm": 1283,
"tax_name": "Bacteroides fragilis",
"tax_rank": "species"
},
{
"taxon": 818,
"parent": 816,
"count": 208,
"count_norm": 3708,
"tax_name": "Bacteroides thetaiotaomicron",
"tax_rank": "species"
},
{
"taxon": 820,
"parent": 816,
"count": 41,
"count_norm": 731,
"tax_name": "Bacteroides uniformis",
"tax_rank": "species"
},
{
"taxon": 821,
"parent": 816,
"count": 3490,
"count_norm": 62226,
"tax_name": "Bacteroides vulgatus",
"tax_rank": "species"
},
{
"taxon": 823,
"parent": 375288,
"count": 120,
"count_norm": 2139,
"tax_name": "Parabacteroides distasonis",
"tax_rank": "species"
},
{
"taxon": 842,
"parent": 841,
"count": 11,
"count_norm": 196,
"tax_name": "Roseburia cecicola",
"tax_rank": "species"
},
{
"taxon": 853,
"parent": 216851,
"count": 7853,
"count_norm": 140019,
"tax_name": "Faecalibacterium prausnitzii",
"tax_rank": "species"
}
]
}]
Upvotes: 2
Views: 39
Reputation: 73241
Don't use underscore, it's shorter with plain js.
data.forEach(e => e.ubiome = e.ubiome.filter(e => e.tax_rank === 'species'));
console.log(data);
<script>
let data = [
{
"sample_date": "2017-07-04T00:00:00.000Z",
"ubiome": [
{
"taxon": 817,
"parent": 816,
"count": 72,
"count_norm": 1283,
"tax_name": "Bacteroides fragilis",
"tax_rank": "species"
},
{
"taxon": 818,
"parent": 816,
"count": 208,
"count_norm": 3708,
"tax_name": "Bacteroides thetaiotaomicron",
"tax_rank": "species"
},
{
"taxon": 820,
"parent": 816,
"count": 41,
"count_norm": 731,
"tax_name": "Bacteroides uniformis",
"tax_rank": "species"
},
{
"taxon": 821,
"parent": 816,
"count": 3490,
"count_norm": 62226,
"tax_name": "Bacteroides vulgatus",
"tax_rank": "species"
},
{
"taxon": 823,
"parent": 375288,
"count": 120,
"count_norm": 2139,
"tax_name": "Parabacteroides distasonis",
"tax_rank": "species"
},
{
"taxon": 832,
"parent": 204431,
"count": 12,
"count_norm": 213,
"tax_name": "Fibrobacter",
"tax_rank": "genus"
},
{
"taxon": 841,
"parent": 186803,
"count": 1285,
"count_norm": 22911,
"tax_name": "Roseburia",
"tax_rank": "genus"
},
{
"taxon": 842,
"parent": 841,
"count": 11,
"count_norm": 196,
"tax_name": "Roseburia cecicola",
"tax_rank": "species"
},
{
"taxon": 853,
"parent": 216851,
"count": 7853,
"count_norm": 140019,
"tax_name": "Faecalibacterium prausnitzii",
"tax_rank": "species"
},
{
"taxon": 976,
"parent": 68336,
"count": 26028,
"count_norm": 464081,
"tax_name": "Bacteroidetes",
"tax_rank": "phylum"
}
]
},
{
"sample_date": "2017-07-04T00:00:00.000Z",
"ubiome": [
{
"taxon": 817,
"parent": 816,
"count": 72,
"count_norm": 1283,
"tax_name": "Bacteroides fragilis",
"tax_rank": "species"
},
{
"taxon": 818,
"parent": 816,
"count": 208,
"count_norm": 3708,
"tax_name": "Bacteroides thetaiotaomicron",
"tax_rank": "species"
},
{
"taxon": 820,
"parent": 816,
"count": 41,
"count_norm": 731,
"tax_name": "Bacteroides uniformis",
"tax_rank": "species"
},
{
"taxon": 821,
"parent": 816,
"count": 3490,
"count_norm": 62226,
"tax_name": "Bacteroides vulgatus",
"tax_rank": "species"
},
{
"taxon": 823,
"parent": 375288,
"count": 120,
"count_norm": 2139,
"tax_name": "Parabacteroides distasonis",
"tax_rank": "species"
},
{
"taxon": 832,
"parent": 204431,
"count": 12,
"count_norm": 213,
"tax_name": "Fibrobacter",
"tax_rank": "genus"
},
{
"taxon": 841,
"parent": 186803,
"count": 1285,
"count_norm": 22911,
"tax_name": "Roseburia",
"tax_rank": "genus"
},
{
"taxon": 842,
"parent": 841,
"count": 11,
"count_norm": 196,
"tax_name": "Roseburia cecicola",
"tax_rank": "species"
},
{
"taxon": 853,
"parent": 216851,
"count": 7853,
"count_norm": 140019,
"tax_name": "Faecalibacterium prausnitzii",
"tax_rank": "species"
},
{
"taxon": 976,
"parent": 68336,
"count": 26028,
"count_norm": 464081,
"tax_name": "Bacteroidetes",
"tax_rank": "phylum"
}
]
}];
</script>
IMHO underscore/lodash were more important before plain js had the exact same functions, most is now on the Array.prototype which makes it much easier to chain, clearer to read, ... using plain JavaScript.
Upvotes: 1