mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-18 15:17:25 +01:00
add pickDeep utility function to pick nested properties from objects
This commit is contained in:
13
common/script/libs/pickDeep.js
Normal file
13
common/script/libs/pickDeep.js
Normal 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;
|
||||||
|
};
|
||||||
@@ -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),
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|||||||
34
test/common/libs/pickDeep.js
Normal file
34
test/common/libs/pickDeep.js
Normal 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');
|
||||||
|
});
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user