2017-06-07 1 views
4

Ich habe einen Code wie folgt auf meine appIst es möglich, eine Eigenschaft in einem Objekt zu ändern und das Objekt selbst zurückzugeben?

var name = 'TesT'; 
var nameLowercase = name && name.toLowerCase(), 
    namesToTest = ['asd', 'asd1', 'TesT']; 

var findCorrectName = R.pipe(
    R.map(R.toLower),  
    R.any(R.equals(nameLowercase)) 
); 

var hasFoundName = findCorrectName (namesToTest); 

return hasFoundName; 

Aber jetzt brauche ich eine Suche in einer Liste von Objekten zu tun, und die Eigenschaft ‚Name‘ in Kleinbuchstaben gesetzt werden müssen. Wenn ein Objekt gefunden wird, das meiner Suche entspricht, muss ich es bekommen.

Ich habe die Dokumentation gelesen, aber ich konnte keine Lösung finden.

var name = 'TesT'; 
var nameLowercase = name && name.toLowercase(), 
namesToTest = [ { name : 'asd', otherProperties... }, 
       { name : 'asd1', otherProperties... }, 
       { name : 'TesT', otherProperties... }]; 

var findByCorrectName = R.pipe(
    R.map(
     R.pipe(R.prop('name'), R.toLower)), 
     R.find(R.propEq('name', nameLowercase)) 
    ); 

var foundObject = findByCorrectName (namesToTest); 

return foundObject; 

Antwort

3

Ich würde dies eine einfache Art und Weise finden, Ihr Problem zu lösen:

const items = [{name : 'asd', x: 1}, {name : 'asd1', x: 2}, {name : 'TesT', x: 3}]; 

const byNameCi = curry((name, items) => find(
    where({name: pipe(toLower, equals(toLower(name)))}), 
    items, 
)); 

byNameCi('TEST', items); //=> {name: "TesT", x: 3} 

Die curry möglicherweise nicht für Ihren Anwendungsfall notwendig sein, aber es würde diese auch erlauben:

const findAsd = byNameCi('Asd'); 
// later 
findAsd(items); //=> {name: "asd", x: 1} 

Beachten Sie, dass dies die ursprünglichen Werte ohne die toLowerCase-Umwandlung zurückgibt. Wenn Sie mit transformierten Namen zurückkehren diejenigen wollen, dann könnte ich es wie folgt ändern:

const byTransformedNameCi = curry((name, items) => find(
    where({name: pipe(toLower, equals(toLower(name)))}), 
    map(evolve({name: toLower}), items), 
)); 

byTransformedNameCi('TEST', items); //=> {name: "test", x: 3} 

Oder, wie Sie sagen, mit lensProp und over statt evolve.

Während es wahrscheinlich möglich ist, diese Punkt-frei zu machen, sind diese schon ziemlich lesbar, so dass ich keinen guten Grund sehe, mich darum zu bemühen.

Sie können diese Ansätze auf der Ramda REPL sehen.


Sie haben in Ihrem Titel über die Umwandlung einer Eigenschaft und die Rückgabe des Objekts gefragt. Ramda wird Ihre Daten nicht wirklich ändern. Wenn Sie danach suchen, ist Ramda nicht die richtige Bibliothek für Sie. Aber es wird ein neues Objekt mit dieser transformierten Eigenschaft zurückgeben, und es hat viele Funktionen, die dies auf verschiedene Arten tun, einschließlich der bereits erwähnten, assoc, adjust und andere.

+0

Was für eine erstaunliche Antwort! Vielen Dank! Ich glaube, ich verstehe diese Bibliothek jetzt besser. Natürlich muss ich weiter lernen, aber deine Antwort hat mir sehr geholfen –

0

Ich habe die function over gefunden, es war nur ich brauche.

var name = 'TesT', 
    nameLowercase = name && name.toLowerCase(), 
    namesToTest = [ { name : 'asd' }, 
        { name : 'asd1' }, 
        { name : 'TesT' }]; 

var findByCorrectName = R.pipe(
          R.map(R.over(R.lensProp('name'), R.toLower)),  
          R.find(R.propEq('name', nameLowercase)) 
         ); 

var hasFoundName = findByCorrectName (namesToTest); 

return hasFoundName; 
+0

Darf ich annehmen, Sie meinen 'R.find (R.propEq ('name', nameLowercase))'? Ohne das 'name'-Argument funktioniert das nicht. –

+0

@ScottSauyet Sie haben Recht .. Ich vermisste den "Namen" als Argument .. Danke, habe ich meine Antwort jetzt behoben –

Verwandte Themen