嗨,所以我有一个对象数组。这些对象以某种方式获得$$hashKey
。我需要删除$$hashKey
,以便我的drop重复或删除唯一逻辑。
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 :(得分:3)
我假设你真的想要uniq
而不是dropRepeats
。 uniq
为您提供列表中不同元素的集合。 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)
答案 1 :(得分:2)
我会尝试:
const removeRepeats = tickers => {
console.log('removeRepeats', tickers);
tickers = _.map(tickers, ticker => { return {ticker: ticker["ticker"]}; });
return R.dropRepeats(tickers);
};
答案 2 :(得分: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))