首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从对象数组中提取属性,然后通过lodash基于此属性创建另一个对象?

从对象数组中提取属性,然后通过lodash基于此属性创建另一个对象?
EN

Stack Overflow用户
提问于 2021-10-30 18:16:44
回答 1查看 55关注 0票数 0

我有以下数组:

代码语言:javascript
复制
[
  {
    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'
  }
]

我想得到的是:

代码语言:javascript
复制
[
  {
    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来实现这个功能,但是解决方案并不能让我满意:

代码语言: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
                })

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-31 15:02:00

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

代码语言:javascript
复制
const accumulator = {};
tradingPairsWithPrices.forEach(pair => {
  accumulator[pair.baseAsset] = pair.baseAssetPrecision;
  accumulator[pair.quoteAsset] = pair.quoteAssetPrecision;
});
return accumulator
  .entries()
  .map(([ticker, precision]) => ({ ticker, precision }));

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

代码语言:javascript
复制
_.chain(traidingPairsWithPrices)
  .flatMap(splitBaseAndQuote) // as you already do
  .uniqBy('ticker')
  .value()

如果你有一个很长很长的列表,每个ticker值都有很多条目,那么第一种方法会更快。但很可能,并不是那么重要。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69780953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档