2016-09-22 116 views
1

Ramda REPL example

嗨,所以我有對象的數組。這些物體以某種方式獲得$$hashKey。我需要刪除$$hashKey,以便我的重複刪除或刪除唯一邏輯。

let tickers = [ 
    { 
    $$hasKey: "object:280", 
    ticker: 'goog' 
    }, 
    { 
    $$hasKey: "object:308", 
    ticker: 'goog' 
    }, 
    { 
    $$hasKey: "object:327", 
    ticker: 'goog' 
    } 
] 

R.uniq(tickers); //-> Returns all instead of 1 

R.dropRepeats(tickers); //-> Returns all instead of 1 

我想這一點,但隨後我的代號陣列結束了3個undefined值。

const removeRepeats = tickers => { 
    console.log('removeRepeats', tickers); 
    tickers = _.map(tickers, ticker => { 
     delete ticker['$$hasKey']; 
    }); 

    return R.dropRepeats(tickers); 
}; 
+0

是否「ramda」有**地圖()**? – JonSG

+0

是http://ramdajs.com/docs/#map –

+1

如果更新removeRepeats,會發生什麼情況:** tickers = _.map(tickers,ticker => {return {ticker:ticker [「ticker」]};} ); ** – JonSG

回答

2

我會嘗試:

const removeRepeats = tickers => { 
    console.log('removeRepeats', tickers); 
    tickers = _.map(tickers, ticker => { return {ticker: ticker["ticker"]}; }); 
    return R.dropRepeats(tickers); 
}; 
2

我不知道爲什麼你既需要lodash和ramda在一起。任何單獨lodash或ramda的是足以與一個襯墊

lodash:

_.uniqWith(_.map(tickers, (ticker) => _.pick(ticker, ['ticker'])), _.isEqual) 

ramda:

R.uniq(R.map(R.pick(['ticker']))(tickers)) 

,或者如果你想不開始$$(角內部屬性的所有屬性比較)

lodash:

_.uniqWith(_.map(tickers, (ticker) => _.pickBy(ticker, (val, key) => !_.startsWith(key, '$$'))), _.isEqual) 

ramda:

R.uniq(R.map(R.pickBy((v, k) => !k.startsWith('$$')))(tickers)) 
3

我假設你真的想uniq而非dropRepeatsuniq爲您提供列表中不同元素的集合。 dropRepeats只是刪除相同值的連續副本。 ([1, 1, 2, 3, 3, 3, 2, 2, 1] => [1, 2, 3, 2, 1])。

要做到這一點,我會認爲這是兩個步驟,一個創建沒有違規密鑰的版本(Ramda的dissoc應該有所幫助),另一個將列表減少到uniq元素。我可能會寫這樣的:

let myFunc = R.pipe(R.map(R.dissoc('$$hasKey')), R.uniq); 
myFunc(tickers); 

如果你不想簡單地刪除一個單一的財產,而是讓他們的固定列表,你可以這樣做:

R.pipe(R.map(R.pick(['ticker', 'prop2', 'prop3'])), R.uniq)