Calling chain will cause all future method calls to return wrapped objects. When you’ve finished the computation, call value to retrieve the final value. Here’s an example of chaining together a map/flatten/reduce, in order to get the word count of every word in a song.
var lyrics = [{line: 1, words: "I'm a lumberjack and I'm okay"},{line: 2, words: "I sleep all night and I work all day"},{line: 3, words: "He's a lumberjack and he's okay"},{line: 4, words: "He sleeps all night and he works all day"}];_.chain(lyrics).map(function(line) { return line.words.split(' '); }).flatten().reduce(function(counts, word) {counts[word] = (counts[word] || 0) + 1;return counts;}, {}).value();=> {lumberjack: 2, all: 4, night: 2 ... }
In addition, the Array prototype’s methods are proxied through the chained Underscore object, so you can slip a reverse or a push into your chain, and continue to modify the array.
chain
_.chain(obj) source
Returns a wrapped object. Calling methods on this object will continue to return wrapped objects until value is called.
var stooges = [{name: 'curly', age: 25}, {name: 'moe', age: 21}, {name: 'larry', age: 23}];var youngest = _.chain(stooges).sortBy(function(stooge){ return stooge.age; }).map(function(stooge){ return stooge.name + ' is ' + stooge.age; }).first().value();=> "moe is 21"
value
_.chain(obj).value() source
Extracts the value of a wrapped object.
_.chain([1, 2, 3]).reverse().value();=> [3, 2, 1]
