Tuesday, 15 February 2011

javascript - Underscore JS _.partial reduce maintaining memo reference and casting integers to string? -



javascript - Underscore JS _.partial reduce maintaining memo reference and casting integers to string? -

given next (simplified) code, attempting dynamically calculate bootstrap grid:

(function() { var reducecalc = _.partial(_.reduce, _, function(memo, entry) { console.log(entry); console.log((_.last(memo) + parseint(entry))); if (!entry || (parseint(_.last(memo) + parseint(entry)) <= 12)) { _.last(memo).push(entry); } else { memo.push([entry]); } homecoming memo; }, [ [] ]); var onelist = [6, 6]; var twolist = [7, 5, 4, 6]; var rowlistone = reducecalc(onelist); var rowlisttwo = reducecalc(twolist); console.log(rowlistone); console.log(rowlisttwo); })();

two questions,

the parseint necessary, because without sec console log: console.log((_.last(memo) + entry)); casts both integers strings , returns "66", "75". why that?

the second, , much more major question is: why appear maintain reference memo, rather resetting [[]] per run? final console logs are:

[array[0], array[2], array[3], array[1]] [array[0], array[2], array[3], array[1]]

why maintain reference? how can avoid doing so? demo plunkr here:

http://plnkr.co/edit/dtbgrisg4milguoaureu?p=preview

let @ parseint stuff first. underlying problem sort of things you're storing in memo:

memo.push([entry])

so entries of memo single element arrays , _.last(memo) array. if seek array + something_else you'll end coercing strings , doing string concatenation because, more or less, ends getting stringified when javascript doesn't know else do. want within arrays within memo:

console.log(_.last(memo)[0] + entry)

keep in mind console.log variadic say:

console.log(_.last(memo), entry)

that leave confusing live references in console maybe better:

console.log(_.clone(_.last(memo)), entry)

your sec problem reference problem. you're saying things:

var fn = function(memo,entry) { ... }; var aoa = [ [ ] ]; var reducecalc = _.partial(_.reduce, _, fn, aoa);

that aoa array stashed within reducecalc , exact array used every invocation of reducecalc. there's nil anywhere in code create new array each invocation.

if want new array you'd need this:

var reducecalc = _.partial(_.reduce, _, function(memo, entry) { memo = memo || [ [ ] ]; // create new array specific invocation //... homecoming memo; }, null);

the odd looking null needed trick _.reduce supplying null value memo first time calls callback, _.reduce utilize argument's first entry initial memo if don't specify explicit one.

javascript functional-programming underscore.js pass-by-reference

No comments:

Post a Comment