add pickDeep utility function to pick nested properties from objects

This commit is contained in:
Matteo Pagliazzi
2016-03-20 13:07:14 +01:00
parent 957e1d26d6
commit 71f304786c
4 changed files with 51 additions and 2 deletions

View File

@@ -0,0 +1,13 @@
// An utility to pick deep properties from an object.
// Works like _.pick but supports nested props (ie pickDeep(obj, ['deep.property']))
import _ from 'lodash';
module.exports = function pickDeep (obj, properties) {
if (!_.isArray(properties)) throw new Error('"properties" must be an array');
let result = {};
_.each(properties, (prop) => _.set(result, prop, _.get(obj, prop)));
return result;
};

View File

@@ -2,6 +2,7 @@ import i18n from '../i18n';
import content from '../content/index'; import content from '../content/index';
import _ from 'lodash'; import _ from 'lodash';
import splitWhitespace from '../libs/splitWhitespace'; import splitWhitespace from '../libs/splitWhitespace';
import pickDeep from '../libs/pickDeep';
import { import {
BadRequest, BadRequest,
NotAuthorized, NotAuthorized,
@@ -43,7 +44,7 @@ module.exports = function buyMysterySet (user, req = {}, analytics) {
user.purchased.plan.consecutive.trinkets--; user.purchased.plan.consecutive.trinkets--;
return { return {
data: _.pick(user, splitWhitespace('items purchased.plan.consecutive')), data: pickDeep(user, splitWhitespace('items purchased.plan.consecutive')), // TODO this is broken, _.pick doesn't support nested keys
message: i18n.t('hourglassPurchaseSet', req.language), message: i18n.t('hourglassPurchaseSet', req.language),
}; };
}; };

View File

@@ -2,6 +2,7 @@ import content from '../content/index';
import i18n from '../i18n'; import i18n from '../i18n';
import _ from 'lodash'; import _ from 'lodash';
import splitWhitespace from '../libs/splitWhitespace'; import splitWhitespace from '../libs/splitWhitespace';
import pickDeep from '../libs/pickDeep';
module.exports = function(user, req, cb, analytics) { module.exports = function(user, req, cb, analytics) {
var analyticsData, key, ref, type; var analyticsData, key, ref, type;
@@ -50,5 +51,5 @@ module.exports = function(user, req, cb, analytics) {
return typeof cb === "function" ? cb({ return typeof cb === "function" ? cb({
code: 200, code: 200,
message: i18n.t('hourglassPurchase', req.language) message: i18n.t('hourglassPurchase', req.language)
}, _.pick(user, splitWhitespace('items purchased.plan.consecutive'))) : void 0; }, pickDeep(user, splitWhitespace('items purchased.plan.consecutive'))) : void 0;
}; };

View File

@@ -0,0 +1,34 @@
import pickDeep from '../../../common/script/libs/pickDeep';
describe('pickDeep', () => {
it('throws an error if "properties" is not an array', () => {
expect(pickDeep).to.throw(Error);
});
it('returns an object of properties taken from the input object', () => {
let obj = {
a: true,
b: [1, 2, 3],
c: {
nested: {
two: {
times: true,
},
},
},
d: false,
};
let res = pickDeep(obj, ['a', 'b[0]', 'c.nested.two.times']);
expect(res.a).to.be.true;
expect(res.b).to.eql([1]);
expect(res.c).to.eql({
nested: {
two: {
times: true,
},
},
});
expect(res).to.not.have.property('d');
});
});