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

How to remove $$hashKey from objects?

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

我会尝试:

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

我不知道为什么你需要同时使用 lodash 和 ramda。一个 liner

lodash:

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

拉姆达:

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

或者如果您想比较所有以 $$ 开头的属性(angular 内部属性)

lodash:

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

拉姆达:

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

我假设你真的想要 uniq rather than 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)