Tengo una matriz de Foo llamada fooArray , pero me gustaría map() la matriz para que solo contenga los pares "clave: valor" que se definen en arrayOfKeys .
class Foo { id: number; name: string; age: number; constructor(id: number, name: string, age: number) { this.id = id; this.name = name; this.age = age; } } let fooArray: Foo[] = [ new Foo(1, 'Foo', 20), new Foo(2, 'Bar', 21), new Foo(3, 'MyFoo', 20) ]; //The keys I would like to select from Foo. const arrayOfKeys: (keyof Foo)[] = ['name', 'age'];No sé qué hacer para obtener el resultado deseado a continuación:
// The result is a copy of 'fooArray', but the objects only // contain the keys (and their values) defined in 'arrayOfKeys'. [ { name: 'Foo', age: 20 }, { name: 'Bar', age: 21 }, { name: 'MyFoo', age: 20 } ]¿Probablemente pueda hacer esto creando un nuevo objeto en el mapa y devolviéndolo?
Algo como
const fooArrayWithLimitedKeys = fooArray.map(item => arrayOfKeys.reduce( (accumulator, key) => { accumulator[key] = item[key] return accumulator }, {}) ) también se puede escribir sin reduce como sigue:
const fooArrayWithLimitedKeys = fooArray.map(item => { const returnValue = {} arrayOfKeys.forEach(key => { returnValue[key] = item[key] }) return returnValue; })Teniendo en cuenta que simplemente desea modificar cada elemento de su matriz de objetos para que solo contenga las claves deseadas, puede hacerlo así:
const src = [ { id: 1, name: 'Foo', age: 20 }, { id: 2, name: 'Bar', age: 21 }, { id: 3, name: 'MyFoo', age: 20 } ] const keys = ['name', 'age'] const result = src.map(item => Object.assign( ...keys.map(key => ({[key]: item[key]})) )) console.log(result)Puede usar la Destrucción de objetos, dentro de una función de mapa, algo así.
class Foo { id: number; name: string; age: number; constructor(id: number, name: string, age: number) { this.id = id; this.name = name; this.age = age; } } let fooArray: Foo[] = [ new Foo(1, 'Foo', 20), new Foo(2, 'Bar', 21), new Foo(3, 'MyFoo', 20) ]; const arrayOfKeys: (keyof Foo)[] = ['name', 'age']; const result = fooArray.map(element =>(({name,age}) => ({name,age}))(element)); console.log(result);