2016-06-21 1 views
2

Existe-t-il un moyen plus concis d'ajouter un élément à un tableau qui est une propriété d'un objet?Façon concise d'ajouter de manière immuable un objet à un tableau qui est une propriété d'un objet et de retourner le nouvel objet

Impératif:

secitems.sections.push("Test") 
return secitems 

fonctionnelle:

const R = require("ramada") 
return Object.assign({}, secitems, { 
       sections: R.append(
        "Test", 
        secitems.sections 
       ) 
      }) 

Ma version fonctionnelle semble trop longue et compliquée par rapport à la version impérative. Y a-t-il une façon plus concise de l'écrire?

Répondre

3

Mise à jour (TL; DR)

je le ferais comme ceci:

const seclens = lensProp('sections'); 
over(seclens, append('Test'), secitems); 
//=> {id: 123, sections: ['Foo', 'Bar, 'Test']} 

Il y a plusieurs façons de le faire de façon plus concise. Certains d'entre eux aussi pour résoudre les problèmes que votre code d'origine ne gère pas:

// This works fine 
const secitems = {id: 123, sections: ['Foo', 'Bar']}; 
secitems.sections.push("Test") 
secitems; //=> {id: 123, sections: ['Foo', 'Bar', 'Test']} 

// But this is a problem 
const secitems = {id: 123}; 
secitems.sections.push("Test") 
secitems; //=> throws "secitems.sections is undefined" 

Ma méthode préférée en utilisant Ramda serait d'utiliser des lentilles:

const secitems = {id: 123, sections: ['Foo', 'Bar']}; 

over(lensProp('sections'), append('Test'), secitems); 
//=> {id: 123, sections: ['Foo', 'Bar, 'Test']} 

L'avantage est que l'objectif lui-même est utile dans plusieurs contextes:

const seclens = lensProp('sections'); 

const getSections = view(seclens); 
getSections(secitems); //=> ['Foo', 'Bar'] 

const setSections = set(seclens); 
setSections(['Baz, Qux'], secitems) 
//=> {id: 123, sections: ['Baz', 'Qux']} 
setSections(['Baz', 'Qux'], {id: 456}) 
//=> {id: 456, sections: ['Baz', 'Qux']} 

Et si votre structure de données devait changer, le seul code qui aurait besoin de changer serait la définition de l'objectif lui-même:

const obj = {id: 123, secitems: {sections: ['Foo', 'Bar']}}; 

over(lensPath(['secitems', 'sections']), append('Test'), obj); 
//=> {id: 123, secitems: {sections: ['Foo', 'Bar, 'Test']}} 

Ou

const seclens = lensPath(['secitems', 'sections']); 

const getSections = view(seclens); 
getSections(obj); //=> ['Foo', 'Bar'] 

const setSections = set(seclens); 
setSections(['Baz, Qux'], obj) 
//=> {id: 123, secitems: {sections: ['Baz', 'Qux']}} 
setSections(['Baz', 'Qux'], {id: 456}) 
//=> {id: 456, secitems: {sections: ['Baz', 'Qux']}} 

Il y a plus d'informations dans Ramda's lens documentation.

2
const R = require('ramda') 
return R.mergeWith(R.concat, secitems, { sections: ["Test"] })