2017-05-23 3 views
0

Sagen wir, ich habe den folgenden Code:Ramda.js zupfen (key) Typ vs nativer Karte

const results = //some complex datastructure generated by a third party api call 
const reducedList = results.map((item) => item.awesome_key) 
    .map((awesomeKeyList) => awesomeKeyList 
    .reduce((memo, awesomeKey) => {//stuff},{}))) 

Dieser Code funktioniert wie ein Charme. Nun sage ich entschieden Ramda für die erste Karte durch zupfen zu verwenden wie so:

import R from Ramda; 
    R.pluck('awesome_key', results) 
    .map((awesomeKeyList) => awesomeKeyList 
     .reduce((memo, awesomeKey) => {},{}))) 

Dies wird nicht mit:

Property 'reduce' does not exist on type '{}'. 

Die Typen auf Ramda.pluck sind:

pluck<T>(p: string|number, list: any[]): T[]; 
pluck(p: string|number): <T>(list: any[]) => T[]; 

Was ist mit diesen Typen verhindert mich auf diese Weise zu reduzieren?

Ein Beispiel (vereinfacht) Struktur:

things: [ 
    { 
    awesome_key: [{ 
     long_name: 'string', 
     short_name: 'string', 
     types: { 
     0: 'string from set', 
     1?: 'string' 
     } 
    }] 
    other_fields not relevant here 
    } 
] 
+0

Sie teilen einige ([vereinfachte] (https://stackoverflow.com/help/mcve)) Daten, die das Problem aufzeigt? –

+0

Daten von Drittanbieter API hinzugefügt wie angefordert –

+0

Ich bekomme die gleichen Ergebnisse mit beiden Format. Es gibt also wahrscheinlich etwas Bestimmtes für deinen Code oder deine Daten. –

Antwort

0

mit diesem Start:

const results = [ 
    { 
    awesome_key: [{ 
     long_name: 'foo', 
     short_name: 'bar', 
     types: { 
     0: 'abc', 
     1: 'def', 
     2: 'ghi' 
     } 
    }, { 
     long_name: 'baz', 
     short_name: 'qux', 
     types: { 
     0: 'pqr', 
     1: 'xyz' 
     } 
    }], 
    other_fields: 'not relevant here' 
    } 
] 
const interestingTypes = ['pqr', 'xyz']; 

diese beiden beide das gleiche Verhalten haben, soweit ich sagen kann:

results.map((item) => item.awesome_key) 
    .map((addressComponentList) => addressComponentList.reduce((memo, addressComponent) => { 
    if (interestingTypes.indexOf(addressComponent.types[0]) !== -1) { 
     if (!memo[addressComponent.types[0]]) { 
     memo[addressComponent.types[0]] = addressComponent.long_name 
     } 
    } 
    return memo 
    },{})); 

R.pluck('awesome_key', results) 
    .map((addressComponentList) => addressComponentList.reduce((memo, addressComponent) => { 
    if (interestingTypes.indexOf(addressComponent.types[0]) !== -1) { 
     if (!memo[addressComponent.types[0]]) { 
     memo[addressComponent.types[0]] = addressComponent.long_name 
     } 
    } 
    return memo 
    },{})); 

wie dies, was ein bisschen idiomatischer für Ramda ist:

R.pipe(
    R.pluck('awesome_key'), 
    R.map(reduce((memo, addressComponent) => { 
    if (interestingTypes.indexOf(addressComponent.types[0]) !== -1) { 
     if (!memo[addressComponent.types[0]]) { 
     memo[addressComponent.types[0]] = addressComponent.long_name 
     } 
    } 
    return memo 
    },{})) 
)(results) 

Offensichtlich könnte dies wahrscheinlich auch ein bisschen aufgeräumt werden, aber ich basiere den Code auf your other question.

pluck('field', xs) sollte wirklich die gleiche Art von Wert wie xs.map(x => x.field) zurückgeben.

Die Typoskript Signaturen Sie Liste sind nicht, wie ich von pluck denken, die als :: k -> [{k: v}] -> [v] dokumentiert wird, was bedeutet, dass es diesen Schlüssel enthält, eine (String) Schlüssel und eine Liste der Objekte akzeptiert eine Liste von Werten Rückkehr