2016-09-22 42 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)