Dyalog APL:如何像filter()函数一样过滤数组

4
我需要从数组(命名空间)中过滤掉所有不满足所需条件的值:字段 'status' = 'TRADING'。
我使用这个变体。
tmpSymbolsT←(data←⎕JSON(HttpCommand.Get'api.binance.com/api/v3/exchangeInfo').Data).symbols
tmpSymbols←{(⍵.status≡'TRADING')⌿⍵}⍨¨tmpSymbolsT

然而,它返回了包装器中的每一行,而我想要干净的行。
      tmpSymbols[1] ⍝ I have
┌─────────────────────────────────┐
│┌───────────────────────────────┐│
││ #.[JSON object].[JSON object] ││
│└───────────────────────────────┘│
└─────────────────────────────────┘


      tmpSymbolsT[1] ⍝ I need like this
#.[JSON object].[JSON object]

怎么做呢?
1个回答

2
问题在于你对每个(¨)对象进行单独过滤,而不是对整个集合进行过滤。
(顺便说一下,在这种情况下,你还有一个不必要的通勤(),它在这个上下文中没有任何作用。)
所以,你真正想要的是类似于tmpSymbols←{(⍵.status≡'TRADING')⌿⍵}tmpSymbolsT这样的东西,但现在⍵.status是一个状态的向量(列表),当然不会与单个状态'TRADING'匹配()。你有几个修复这个问题的选项:
  1. ⍵.status≡¨⊂'TRADING' 使用明确的each操作符,并将单个状态用括号()括起来,以便用于每个比较。
  2. 'TRADING'∘≡¨⍵.status 将单个状态绑定到匹配函数,从而得到一个"是否交易"的函数,然后将其应用于每个状态。
  3. ⍵.status∊⊂'TRADING' 将单个状态括起来,并检查所有状态中哪些是单个状态数组的成员。

以下是一个实现你所需功能的代码示例:

      tmpSymbolsT←(data←⎕JSON(HttpCommand.Get'api.binance.com/api/v3/exchangeInfo').Data).symbols
      tmpSymbols←{(⍵.status∊⊂'TRADING')⌿⍵}tmpSymbolsT
      tmpSymbols[1]
#.[JSON object].[JSON object]

我喜欢⍵.status∊⊆'TRADING'这个模式,因为它意味着你可以通过将更多的术语作为字符向量附加来简单地进行多个(或)过滤。例如:⍵.status∊⊆'TRADING' 'BREAK' - undefined
@RikedyP 虽然这样做很危险,因为迟早你可能会寻找多个数值,而它会失败。最好使用{⊂⍣(''≡0/⍵)⊢⍵}而不是 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接