Escribí estas dos funciones que mapean y filtran las propiedades de los objetos planos:
var mapObject = (obj, f, ctx) => { ctx = ctx || this; var result = {}; Object.keys(obj).forEach(function(k) { result[k] = f.call(ctx, obj[k], k, obj); }); return result; }; var filterObject = (obj, f, ctx) => { ctx = ctx || this; Object.keys(obj).filter(v => { return (!f.call(ctx, obj[v], v, obj)) }).forEach(v => { delete obj[v]; }) return obj; }Estas dos funciones pueden asignar propiedades "planas" (es decir, objetos no anidados) de un objeto o pueden filtrar propiedades de objetos no anidados de esta manera:
var mapObject = (obj, f, ctx) => { ctx = ctx || this; var result = {}; Object.keys(obj).forEach(function(k) { result[k] = f.call(ctx, obj[k], k, obj); }); return result; }; var filterObject = (obj, f, ctx) => { ctx = ctx || this; Object.keys(obj).filter(v => { return (!f.call(ctx, obj[v], v, obj)) }).forEach(v => { delete obj[v]; }) return obj; } console.log(mapObject({ name: "james", surname: "joyce" }, (v, k) => v.toUpperCase())) console.log(filterObject({ name: "james", surname: "joyce" }, (v, k) => k != "name")) console.log(mapObject(filterObject({ name: "james", surname: "joyce" }, (v, k) => k != "name"), (v, k) => v.toUpperCase()))¿Cómo aplicar esto de manera eficiente a objetos anidados, es decir, objetos que tienen propiedades de objetos?
Creo que una forma más eficiente de aplicar esto a objetos anidados es la recursividad, como ejemplo:
const mapObject = (obj, f, ctx) => { ctx = ctx || this; var result = {}; Object.keys(obj).forEach(function(k) { if (typeof obj[k] === 'object' && obj[k] !== null) { result[k] = mapObject(obj[k], f, ctx) } else { result[k] = f.call(ctx, obj[k], k, obj); } }); return result; }; console.log(mapObject({ name: "james", surname: "joyce", obj: { objName: "hi" } }, (v, k) => v.toUpperCase())) const filterObject = (obj, f, ctx) => { ctx = ctx || this; Object.keys(obj).filter(v => { if (typeof obj[v] === 'object' && obj[v] !== null) { filterObject(obj[v], f, ctx) } else { return (!f.call(ctx, obj[v], v, obj)) } }).forEach(v => { delete obj[v]; }) return obj; } console.log(filterObject({ name: "james", surname: "joyce", obj : { name: "objName", surname: "objSurname", } }, (v, k) => k != "name"))