From b7c529d96592fc6f6c8eaaed225d8c0dafe150e9 Mon Sep 17 00:00:00 2001 From: Sami Samhuri Date: Sun, 21 Nov 2010 20:06:10 -0800 Subject: [PATCH] [NEW] ArrayExt: pluck, sortBy --- lib/array-ext.js | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/lib/array-ext.js b/lib/array-ext.js index 0798e9b..669161e 100644 --- a/lib/array-ext.js +++ b/lib/array-ext.js @@ -62,6 +62,22 @@ var ArrayExt = exports.ArrayExt = { // pack // partition + , pluck: function(a, /* key paths, ... */) { + var args = [].slice.call(arguments, 1); + args.unshift(a); + return pluck.apply(null, args); + } + + , sortBy: function(arr, keyPath) { + return arr.slice().sort(function(a, b) { + var propA = drillInto(a) + , propB = drillInto(b); + if (propA < propB) return -1 + if (propA > propB) return 1 + return 0 + }); + } + , toString: function(a) { return '[' + ArrayToString.call(a) + ']'; } @@ -77,3 +93,34 @@ var ArrayExt = exports.ArrayExt = { return b; } }; + + +// pluck + +function getProp(thing, key) { + if (thing === null || thing === undefined) return thing + var prop = thing[key] + return typeof prop === 'function' ? prop.call(thing) : prop +} + +function drillInto(thing, keyPath) { + return keyPath.split('.').reduce(function(memo, key) { + return getProp(memo, key) + }, thing) +} + +function mapInto(thing /* , key paths, ... */) { + var keyPaths = [].slice.call(arguments, 1) + return keyPaths.map(function(keyPath) { + return drillInto(thing, keyPath) + }) +} + +function pluck(things /* , key paths, ... */) { + var keyPaths = [].slice.call(arguments, 1) + return things.map(function(thing) { + var results = mapInto.apply(null, [thing].concat(keyPaths)) + if (results.length > 1) return results + return results[0] + }) +}