2017-05-23 11 views
0

を入力し、私は次のコードを持って言う:Ramda.jsは(キー)を摘み取るネイティブマップ対

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},{}))) 

このコードは、魔法のように動作します。今私はそうのように摘むを介して第1マップにRAMDAを使用することを決めたと言う:

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

これはで失敗します:

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

Ramda.pluckの種類は次のとおりです。

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

これらのタイプは、私がこのようにreduceを使用できないようにするのはどうですか?

例(簡体字)構造:

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

缶問題を示すデータ(シンプルなもの)(https://stackoverflow.com/help/mcve)を共有していますか? –

+0

サードパーティAPIのデータが要求通りに追加されました –

+0

どちらの形式でも同じ結果が得られます。おそらくコードやデータに固有のものがあります。 –

答えて

0

はこれで起動する:

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']; 

これら二つの両方が私の知る限り、同じ動作を持っている:

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 
    },{})); 

のように、これはRamdaにとってもう少し慣れています:

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) 

明らかに、これはおそらく少しでもクリーンアップできますが、コードはyour other questionに基づいています。

pluck('field', xs)は、実際にはxs.map(x => x.field)と同じ種類の値を返す必要があります。

あなたは私が値のリストを返す、それは(文字列)キーと、そのキーを含むオブジェクトのリストを受け入れることを意味し、:: k -> [{k: v}] -> [v]として文書化されpluck、考えられないどのようにしているリストtypescriptです署名

関連する問題