Skip to content

Instantly share code, notes, and snippets.

@aruss
Last active August 14, 2017 07:53
Show Gist options
  • Save aruss/7cd2c279cc2720d23da7 to your computer and use it in GitHub Desktop.
Save aruss/7cd2c279cc2720d23da7 to your computer and use it in GitHub Desktop.
Partial Response Example
/*
Use case:
var map = parseFields('id,name,sub(name)');
var dto = map(obj, map);
*/
exports.parseFields = function(str) {
var obj = {};
if (!str) {
return obj;
}
var re = /(\w+)(\(([\w,]+)\))?,?/g;
var m;
while ((m = re.exec(str)) != null) {
var key = m[1];
if (key) {
var val = m[3];
if (val) {
var vals = val.split(',');
obj[key] = {};
for (var i = 0; i < vals.length; i++) {
obj[key][vals[i]] = true;
};
} else {
obj[key] = true;
}
}
}
return obj;
};
exports.map = function(obj, map, seen) {
if (typeof obj !== 'object' ||
obj === null) {
return obj;
}
seen = seen || {
orig: [],
copy: []
};
var lookup = seen.orig.indexOf(obj);
if (lookup !== -1) {
return seen.copy[lookup];
}
var newObj;
var cloneDeep = false;
if (!Array.isArray(obj)) {
if (Buffer.isBuffer(obj)) {
newObj = Buffer.from(obj);
} else if (obj instanceof Date) {
newObj = new Date(obj.getTime());
} else if (obj instanceof RegExp) {
newObj = new RegExp(obj);
} else {
var proto = Object.getPrototypeOf(obj);
if (!proto || proto.isImmutable) {
newObj = obj;
} else {
newObj = Object.create(proto);
cloneDeep = true;
}
}
} else {
newObj = [];
cloneDeep = true;
}
seen.orig.push(obj);
seen.copy.push(newObj);
if (cloneDeep) {
for (var i in obj) {
if (obj.hasOwnProperty(i)) {
var descriptor = Object.getOwnPropertyDescriptor(obj, i);
if (descriptor.get || descriptor.set) {
Object.defineProperty(newObj, i, descriptor);
} else {
var subMap;
var doMap = true;
if (Array.isArray(obj)) {
subMap = map;
}
else if (map && map[i]) {
subMap = (map && (typeof map[i] === 'object')) ? map[i] : null
}
else if (map) {
doMap = false;
}
if (doMap) {
newObj[i] = exports.map(obj[i], subMap, seen);
}
}
}
}
}
return newObj;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment