如何从对象中删除$$ hashKey?

时间:2016-09-22 23:28:58

标签: javascript object functional-programming ramda.js

Ramda REPL example

嗨,所以我有一个对象数组。这些对象以某种方式获得$$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);
};

3 个答案:

答案 0 :(得分: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)

答案 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))