ramda 中的 Concat 对象项目 nodejs

如何解决ramda 中的 Concat 对象项目 nodejs

我正在尝试在我的 nodejs 后端应用 ramda 来连接对象,但是当它们相等时我无法建立对象的关系。

这里我向您展示第一个安排:

{
  "ETHBTC": "0.03907000","LTCBTC": "0.00481700","BNBBTC": "0.00901600","NEOBTC": "0.00200600","QTUMETH": "0.00902000","EOSETH": "0.00310500","SNTETH": "0.00008902","BNTETH": "0.00308500","BCCBTC": "0.07908100","GASBTC": "0.00032410","BNBETH": "0.23078000","BTCUSDT": "55974.56000000","ETHUSDT": "2186.71000000","HSRBTC": "0.00041400","OAXETH": "0.00017780","DNTETH": "0.00002801","MCOETH": "0.00577200"
}

这里我向您展示第二种安排:

[
  {
    "asset": "BTC","free": "0.01054959","locked": "0.00000000"
  },{
    "asset": "LTC","free": "0.00000000",{
    "asset": "ETH","locked": "0.00000000"
  }
]

这里我向您展示第三种安排:

[
  {
    "symbol": "ETHBTC","status": "TradING","baseAsset": "ETH","baseAssetPrecision": 8,"quoteAsset": "BTC","quotePrecision": 8,"quoteAssetPrecision": 8,"baseCommissionPrecision": 8,"quoteCommissionPrecision": 8,"orderTypes": [
      "LIMIT","LIMIT_MAKER","MARKET","STOP_LOSS_LIMIT","TAKE_PROFIT_LIMIT"
    ],"icebergallowed": true,"ocoAllowed": true,"quoteOrderQtyMarketAllowed": true,"isspotTradingallowed": true,"isMarginTradingallowed": true,"filters": [
      {
        "filterType": "PRICE_FILTER","minPrice": "0.00000100","maxPrice": "100000.00000000","tickSize": "0.00000100"
      },{
        "filterType": "PERCENT_PRICE","multiplierUp": "5","multiplierDown": "0.2","avgPriceMins": 5
      },{
        "filterType": "LOT_SIZE","minQty": "0.00100000","maxQty": "100000.00000000","stepSize": "0.00100000"
      },{
        "filterType": "MIN_NOTIONAL","minNotional": "0.00010000","applyToMarket": true,{
        "filterType": "ICEBERG_PARTS","limit": 10
      },{
        "filterType": "MARKET_LOT_SIZE","minQty": "0.00000000","maxQty": "1784.90123628","stepSize": "0.00000000"
      },{
        "filterType": "MAX_NUM_ORDERS","maxnumOrders": 200
      },{
        "filterType": "MAX_NUM_ALGO_ORDERS","maxnumAlgoOrders": 5
      }
    ],"permissions": [
      "SPOT","MARGIN"
    ]
  },{
    "symbol": "LTCBTC","baseAsset": "LTC","minQty": "0.01000000","stepSize": "0.01000000"
      },"maxQty": "10633.87362057",{
    "symbol": "BNBBTC","baseAsset": "BNB","minPrice": "0.00000010","tickSize": "0.00000010"
      },"maxQty": "3604.01847116",{
    "symbol": "BTCUSDT","baseAsset": "BTC","quoteAsset": "USDT","minPrice": "0.01000000","maxPrice": "1000000.00000000","tickSize": "0.01000000"
      },"minQty": "0.00000100","maxQty": "9000.00000000","stepSize": "0.00000100"
      },"minNotional": "10.00000000","maxQty": "82.65659251","MARGIN"
    ]
  }
]

要做的是首先从第二个数组中获取资产价值,然后在第三个数组中查找其符号。

一旦我知道它的符号是什么,我就用这个符号在第三个数组中查找它的信息(资产、空闲、锁定),即符号(第二个数组)===资产(第三个数组)。

一旦我在三个数组中获得了货币的信息,我必须将第一个数组中的数据与第二个数组中的数据合并(必须将第一个数组的值更改为成本)

这里我向您展示想要的结果:

[
   {
    "asset": "BTC","locked": "0.00000000","cost": "55974.56000000"
  },"cost": "0.00481700"
  },"cost": "0.03907000"
  }
]

解决方法

使用 Javascript Map 的解决方案

我建议从 Map 数组中创建一个 zs,将 baseAsset 映射到 symbol

然后循环遍历 ys 并使用 costMap 数组构造 xs 字段。

const 
   xs = {ETHBTC: "0.03907000",LTCBTC: "0.00481700",BNBBTC: "0.00901600",NEOBTC: "0.00200600",QTUMETH: "0.00902000",EOSETH: "0.00310500",SNTETH: "0.00008902",BNTETH: "0.00308500",BCCBTC: "0.07908100",GASBTC: "0.00032410",BNBETH: "0.23078000",BTCUSDT: "55974.56000000",ETHUSDT: "2186.71000000",HSRBTC: "0.00041400",OAXETH: "0.00017780",DNTETH: "0.00002801",MCOETH: "0.00577200"},ys = [{asset: "BTC",free: "0.01054959",locked: "0.00000000"},{asset: "LTC",free: "0.00000000",{asset: "ETH",locked: "0.00000000"}],zs = [{symbol: "ETHBTC",status: "TRADING",baseAsset: "ETH",baseAssetPrecision: 8,quoteAsset: "BTC",quotePrecision: 8,quoteAssetPrecision: 8,baseCommissionPrecision: 8,quoteCommissionPrecision: 8,orderTypes: ["LIMIT","LIMIT_MAKER","MARKET","STOP_LOSS_LIMIT","TAKE_PROFIT_LIMIT"],icebergAllowed: true,ocoAllowed: true,quoteOrderQtyMarketAllowed: true,isSpotTradingAllowed: true,isMarginTradingAllowed: true,filters: [{filterType: "PRICE_FILTER",minPrice: "0.00000100",maxPrice: "100000.00000000",tickSize: "0.00000100"},{filterType: "PERCENT_PRICE",multiplierUp: "5",multiplierDown: "0.2",avgPriceMins: 5},{filterType: "LOT_SIZE",minQty: "0.00100000",maxQty: "100000.00000000",stepSize: "0.00100000"},{filterType: "MIN_NOTIONAL",minNotional: "0.00010000",applyToMarket: true,{filterType: "ICEBERG_PARTS",limit: 10},{filterType: "MARKET_LOT_SIZE",minQty: "0.00000000",maxQty: "1784.90123628",stepSize: "0.00000000"},{filterType: "MAX_NUM_ORDERS",maxNumOrders: 200},{filterType: "MAX_NUM_ALGO_ORDERS",maxNumAlgoOrders: 5}],permissions: ["SPOT","MARGIN"]},{symbol: "LTCBTC",baseAsset: "LTC",minQty: "0.01000000",stepSize: "0.01000000"},maxQty: "10633.87362057",{symbol: "BNBBTC",baseAsset: "BNB",minPrice: "0.00000010",tickSize: "0.00000010"},maxQty: "3604.01847116",{symbol: "BTCUSDT",baseAsset: "BTC",quoteAsset: "USDT",minPrice: "0.01000000",maxPrice: "1000000.00000000",tickSize: "0.01000000"},minQty: "0.00000100",maxQty: "9000.00000000",stepSize: "0.00000100"},minNotional: "10.00000000",maxQty: "82.65659251","MARGIN"]}],zsMap = new Map(zs.map(({baseAsset,symbol}) => [baseAsset,symbol])),desired = ys.map(o => ({...o,cost: xs[zsMap.get(o.asset)]}))

console.log(desired)

相同的解决方案,但使用 IIFE

const 
   xs = {ETHBTC: "0.03907000",desired = ((zsMap) =>
     ys.map(o => ({ ...o,cost: xs[zsMap.get(o.asset)] })))(
     new Map(zs.map(({ baseAsset,symbol }) => [baseAsset,symbol]))
   );

console.log(desired);

,

我的第一种方法不会使用 Ramda,因为这在 vanilla JS 中看起来相当简单:

const combine = (xs,ys,zs) => 
  ys .map ((
    {asset,...rest},_i,_arr,{symbol = ''} = zs .find (({baseAsset}) => baseAsset == asset),cost = xs [symbol]
  ) => ({asset,...rest,cost}))

const xs = {ETHBTC: "0.03907000",MCOETH: "0.00577200"}
const ys = [{asset: "BTC",locked: "0.00000000"}]
const zs = [{symbol: "ETHBTC","MARGIN"]}]

console .log (combine (xs,zs))
.as-console-wrapper {max-height: 100% !important; top: 0}

我们映射第二个数组的元素,保留它们的所有属性并在第三个数组中搜索 baseAsset 等于当前节点的 asset 的记录,然后查找此新记录的 {{ 1}} 第一个数组中的属性。

风格可能会让人感到陌生。我更喜欢使用表达式而不是语句,所以我使用额外的默认参数而不是局部变量。这需要为 symbol 为其回调提供的额外参数提供虚拟值。那是 Array.prototype.map_i

虽然看看是否有更干净的 Ramda 版本可能会很有趣,但我并不是特别抱有希望。 Ramda 的 _arr 函数会稍微改善这一点,因为它不需要 map_i,但这相当小。

更新

Som Shekhar Mukherjee 提出了一个很好的观点,即使用 _arr 避免重复搜索第二个列表。这个版本做到了这一点,只为调用 Map 保留 Map。但当然,如果您需要多次执行此操作,您可能希望将 combine 存储在外部,并通过它代替 Map。设计和以前一样,只是这次我们在初始调用中添加了一个新的默认参数 zs

map
const combine = (xs,zs,map = new Map (zs .map (({baseAsset,symbol]))) => 
  ys .map ((
    {asset,cost = xs [map .get (asset)]
  ) => ({asset,cost}))


const xs = {ETHBTC: "0.03907000","MARGIN"]}]

console .log (
  combine (xs,zs)
)

(我还修改了 .as-console-wrapper {max-height: 100% !important; top: 0} 中命名属性的处理,再次受到 Som 的启发。)

更新 2

我做最后一个太匆忙了。现在 xs 很容易找到,我们也不需要额外的 cost 回调参数,这变得更加简单:

map
const combine = (xs,symbol]))
) => 
  ys .map (({asset,...rest}) => ({asset,cost: xs [map .get (asset)]}))


const xs = {ETHBTC: "0.03907000",zs)
)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?