I'm seeking advice how to process this JSON:
[{
"title":"Things",
"text":"1. Raindrops on roses 2. Whiskers on kittens 3. Bright copper kettles 4. Warm woolen mittens 5. Brown paper packages"
},{
"title":"Colors",
"text":"1. White 2. Blue 3. Red 4. Yellow 5. Green"
},{
"title":"Animals",
"text":"1. Dog 2. Rabbit 3. Cat 4. Squirrel 5. Duck"
},{
"title":"Colors",
"text":"1. Red 2. Blue 3. Orange 4. Green 5. Purple"
},{
"title":"Animals",
"text":"1. Bear 2. Bird 3. Duck 4. Squirrel 5. Rabbit"
},{
"title":"Colors",
"text":"1. Yellow 2. White 3. Black 4. Brown 5. Blue"
}]
to return these collections of observable arrays:
- Title: Colors, Count: 3, Items:
- Name: White, Score: 9, Count: 2
- Name: Blue, Score: 9, Count: 3
- Name: Red, Score: 8, Count: 2
- Name: Yellow, Score: 7, Count: 2
- Name: Black, Score: 3, Count: 1
- Name: Orange, Score: 3, Count: 1
- Name: Green, Score: 3, Count: 2
- Name: Brown, Score: 2, Count: 1
- Name: Purple, Score: 1, Count: 1
- Title: Animals, Count: 2, Items:
- Name: Bear, Score: 5, Count: 1
- Name: Dog, Score: 5, Count: 1
- Name: Rabbit, Score: 5, Count: 2
- Name: Bird, Score: 4, Count: 1
- Name: Duck, Score: 4, Count: 2
- Name: Squirrel, Score: 4, Count: 2
- Name: Cat, Score: 3, Count: 1
- Title: Things, Count: 1, Items:
- Name: Raindrops on roses, Score: 5, Count: 1
- Name: Whiskers on kittens, Score: 4, Count: 1
- Name: Bright copper kettles, Score: 3, Count: 1
- Name: Warm woolen mittens, Score: 2, Count: 1
- Name: Brown paper packages, Score: 1, Count: 1
To explain, I need to do the following:
- Group all arrays by
title, count their frequency and return new List objects e.g.Title: Colors, Count: 3 - Split each
textitem by number separator to create an array of items, count their frequency, assign them a score based on index position (i.e. [0] = 5 to [4] = 1), sum their scores and return new Item objects e.g.Name: White, Score: 9, Count: 2 - Sort the
Listscollection byCountand theItemscollections byScore,CountandName.
I've created the following javascript objects:
function List(title, items, count) {
var self = this;
self.Title = title;
self.Count = count;
self.Items = ko.observableArray(items);
}
function Item(name, count, score) {
var self = this;
self.Name = name;
self.Count = count;
self.Score = score;
}
I've looked into various approaches I had intended to attack this task with underscore.js but I was put off by reported poor performance at iterating arrays.
I anticipate the JSON file to get much larger than the sample I've shown so performance will be important.
Hopefully, some can suggest the best approach to achieve my objectives and perhaps demonstrate a good starting point.
Thanks in advance.