【问题标题】:Extract property from an array of objects and create another one based on this property via lodash?从对象数组中提取属性并通过 lodash 基于此属性创建另一个?
【发布时间】:2021-10-30 18:16:43
【问题描述】:

我有以下数组:

[
  {
    baseAsset: 'XRP',
    quoteAsset: 'ETH',
    quoteAssetPrecision: 6,
    baseAssetPrecision: 8,
    price: '0.00025170'
  },
  {
    baseAsset: 'MOD',
    quoteAsset: 'BTC',
    quoteAssetPrecision: 8,
    baseAssetPrecision: 4,
    price: '0.00004280'
  },
  {
    baseAsset: 'MOD',
    quoteAsset: 'ETH',
    quoteAssetPrecision: 8,
    baseAssetPrecision: 4,
    price: '0.00116700'
  },
  {
    baseAsset: 'ENJ',
    quoteAsset: 'BTC',
    quoteAssetPrecision: 8,
    baseAssetPrecision: 8,
    price: '0.00004508'
  },
  {
    baseAsset: 'ENJ',
    quoteAsset: 'ETH',
    quoteAssetPrecision: 6,
    baseAssetPrecision: 8,
    price: '0.00064370'
  },
  {
    baseAsset: 'STORJ',
    quoteAsset: 'BTC',
    quoteAssetPrecision: 8,
    baseAssetPrecision: 8,
    price: '0.00002090'
  },
  {
    baseAsset: 'STORJ',
    quoteAsset: 'ETH',
    quoteAssetPrecision: 6,
    baseAssetPrecision: 8,
    price: '0.00029910'
  }
]

我想得到什么:

[
  {
    ticker: 'XRP',
    precision: 8,
  },
  {
    ticker: 'MOD',
    precision: 4,
  },
  {
    ticker: 'BTC',
    precision: 8,
  },
  {
    ticker: 'ENJ',
    precision: 8,
  },
  {
    ticker: 'STORJ',
    precision: 8,
  },
  {
    ticker: 'ETH',
    precision: 6,
  }
]

如您所见,每个 precision 道具都与资产相关联,并且不会更改。我想从我的货币对数组中提取每种货币及其precision。通过lodash 可以提供什么优雅的解决方案?接受其他选项。我试图使用本机 javascript 来实现这一点,但解决方案并不让我满意:

const currenciesFetched = tradingPairsWithPrices
                .flatMap((pair) => [
                    {
                        ticker: pair.baseAsset,
                        precision: pair.baseAssetPrecision,
                    },
                    {
                        ticker: pair.quoteAsset,
                        precision: pair.quoteAssetPrecision,
                    },
                ])
                .filter((v, i, a) => {
                    return a.findIndex((t) => t.ticker === v.ticker) === i
                })

有什么想法吗?

【问题讨论】:

  • 是的,在这种情况下,我只是将一个数组拆分为 2 个对象(第一个对象是 baseAsset,第二个对象是 quoteAsset),其中包含 ticker 和关联的 precision 属性。然后我只需通过ticker 属性过滤我的新对象数组。
  • 不确定我是否理解 .filter() 背后的逻辑(因此也可能会误解所需的结果)。它只是为了每个ticker(取第一个元素)只留下一个条目吗?还是别的什么?
  • 是的,你是对的

标签: javascript lodash


【解决方案1】:

因此,如果目标是获得 ticker + precision 的 uniq 组合,并且我们不期望(所以不要处理)同一 ticker 有不同 precision 的情况,那么我认为最简单的方法就是使用原生 {} 作为收集器(或 Set 作为更具体的替代方案):

const accumulator = {};
tradingPairsWithPrices.forEach(pair => {
  accumulator[pair.baseAsset] = pair.baseAssetPrecision;
  accumulator[pair.quoteAsset] = pair.quoteAssetPrecision;
});
return accumulator
  .entries()
  .map(([ticker, precision]) => ({ ticker, precision }));

使用 lodash 仍然可以实现这一点:

_.chain(traidingPairsWithPrices)
  .flatMap(splitBaseAndQuote) // as you already do
  .uniqBy('ticker')
  .value()

如果您的列表很长,每个 ticker 值都有很多条目,那么第一种方法会更快。但可能并没有那么显着。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多