如何从对象中删除 $$hashKey?
How to remove $$hashKey from objects?
嗨,我有一个对象数组。这些对象以某种方式获得 $$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 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)
嗨,我有一个对象数组。这些对象以某种方式获得 $$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 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)