var thingsGroupedById = _.groupBy(things, function(t){
return 'seller' + t.sellerId
});
// { seller1: [...], seller2: [...] }
But I actually would have failed this in code review: _.map(thingsGroupedById, function (things) {
// ...
});
and replaced it with: _.map(_.keys(thingsGroupedById), function (thingKey) {
var thing = thingsGroupedById[thingKey];
// ...
});
because although mapping over objects is "normal", it has never been 100%. _.map(_.values(thingsGroupedById), function(thing) {
// operate on thing
}
Then there's no need to do the property access yourself.Chaining makes this even nicer:
_(thingsGroupedById).values().map(function(thing) {
}https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refe...
From the Underscore documentation: "Collection functions work on arrays, objects, and array-like objects such as arguments, NodeList and similar".
So basically this bug can lead to false positives when checking for array-like objects.
Object.prototype.toString.call(maybeArray) === "[object Array]"
Also sometimes I feel like I'm the only one who doesn't like to use underscore or jQuery for things like this; iterating over properties is so easy it seems weird to me to use a library to create a new object for me to then iterate through.
Most browsers can do a for..in. At least for me there is no browser in existence that I care about that doesn't have that :)
> nobody has mucked around with Object.prototype
That's just what object.hasOwnProperty(key) is for. An annoying extra check but not a big deal.
> As for the ease of testing if something is an array, figuring out if something is an array is relatively easy but array like objects like arguments and domlist are where length checking comes from.
There is an incredibly limited list; I'd just check for those few items instead of relying on a property existing that other objects could use but I digress.
Edit: There is: https://addons.mozilla.org/en-US/firefox/addon/toggle-animat...
I quote:
> There is not length property inserted on the object, the jQuery folks had already confirmed that. It is a branch on the form of object that was failing due to a bug in the linkage of a jump. That made that bug very bizarre: you can access a length value by identifier, but now get a length property on the same object.
Yes, JavaScript object/array system has it's warts, but to me that's clearly the way it was intended to be used.
The problem with the engine in question is that it makes a hash change its behavior when all keys are integers.
http://stackoverflow.com/questions/22139746/ios-javascript-e...
I found a way to reproduce it, put in a bug report with apple and never got a response.
A simple library upgrade (Underscore 1.7.0 -> 1.8.2) broke a key feature of a site I was working on, but only on my iPhone. It worked just fine on my iPad running the same exact version of iOS.
I ended up using git bisect to narrow down the commit, which consisted of several minor updates to various packages. Of those packages, it was my 3rd or 4th guess as to which would have caused that failure (it wasn't clear since I was having trouble connecting the Safari debugger).
https://github.com/angular/angular.js/issues/9128#issuecomme...
Basically strict mode blows up webkit in odd ways.
This was occurring on iOS 7.1.2 on a single device, from time to time. I realize after reading this, that this might be related to the WebKit bug, since it was the only 64 bit ARM device we had at the time.
The bug disappeared when I simply used _.keys(obj).length instead of _.size(obj). It was very hard to reproduce and I could never isolate it in a sample...
It's NOT the same bug though. It's kind of the opposite. The "length" property would disappear. Would that be caused by the same WebKit bug? Or that's a new one?