如何过滤 JSON.parse 结果

Posted

技术标签:

【中文标题】如何过滤 JSON.parse 结果【英文标题】:How to Filter JSON.parse results 【发布时间】:2020-01-31 01:00:08 【问题描述】:

我一直在尝试根据我的“note”值过滤 API 调用的结果。我一直在 Zapier 上构建它并且调用有效,但我似乎找不到让过滤器功能完成其工作的方法(所以如果我用 return results 替换第 19-23 行;那么它会给我来自api 调用)。我倾注了所有我能找到的堆栈文档,但它们都以错误result.filter not foundbargle 错误(Zapier 中的一般错误)结尾。

const options = 
  url: `https://mystorename.myshopify.com/admin/orders.json?`,
  method: 'GET',
  headers: 
    'Content-Type': 'application/json',
    'Accept': 'application/json'
  ,
  params: 

  


return z.request(options)
  .then((response) => 
    response.throwForStatus();
 
var results = z.JSON.parse(response.content);
var queryItem = "555-5555"
const filteredOrders = results.orders.filter(item => item.note === queryItem);
   return filteredOrders;
  
);

这是我当前输出的一个示例,带有return results; 并且没有过滤器:


  "orders": [
     
      "note": "555-5555",
      "subtotal_price": "1.00"
     ,
     
      "note": "555-6666",
      "subtotal_price": "2.00"
      
  ]

同样,目标是按“note”键中的值进行过滤。因此,如果我的过滤器输入是 555-5555,那么它应该只返回该项目的所有信息。我确实尝试使用 if 语句进行返回,字符串化而不是解析,转换为数组......所有需要的代码,但无论我发现过滤器不起作用或什么都不返回的格式。会继续努力,所以如果我碰巧找到答案,我会发布它,但在这一点上我觉得卡住了。

【问题讨论】:

试试results.orders.filter 不高兴,它返回一个未定义的。加倍检查了我的输出,它与我发布的一样,但要获得我必须放入 return results.orders[0];return results.orders[1]; 的每个项目。 【参考方案1】:

您正在尝试在对象中使用方法filter,但过滤器仅在数组中可用,因此您应该尝试在订单数组中调用filter

let results = 
  "orders": [
     
      "note": "555-5555",
      "subtotal_price": "1.00"
     ,
     
      "note": "555-6666",
      "subtotal_price": "2.00"
      
  ]


let queryItem = "555-5555";

let newArray = results.orders.filter(function (item) 
  return item.note == queryItem
)

console.log(newArray)

更新为包含真正的 http 调用:

const url = 'http://www.mocky.io/v2/5d9466142f000058008ff6b7'

const options = 
    method: 'GET',
    headers: 
      'Content-Type': 'application/json',
      'Accept': 'application/json'
    ,


const response = await fetch(url, options)
const results = await response.json()

const queryItem = "555-5555"
const filteredOrders = results.orders.filter(item => item.note === queryItem)

console.log(filteredOrders)

【讨论】:

这确实有效,但如果我更改为 let results = z.JSON.parse(response.content); 如果失败。这与导致需要更改的问题的 JSON.parse 有关吗? @littlecoder 我不熟悉 shopify 或 zappier,我不知道 z 是什么。但是我用一个真正的 http 调用更新了响应并且它的工作。希望对您有所帮助。 这很奇怪,您的两个答案都“有效”,但由于某种原因在 zapier 中无效。我现在有一张票,他们对此表示支持。我认为z 是他们反对的方式:“......作为第一个参数提供给您的应用程序中的所有函数调用。”但是文档没有提到我找到的 z.filter。【参考方案2】:

您正在尝试过滤 results,但根据您的输出,您应该过滤 results.orders

const filteredOrders = results.orders.filter(item => item.note === queryItem);

【讨论】:

我确实忘记了results.orders 部分。我试过你的答案,但如果仍然无法过滤。我将它添加到我原来的问题中(也许我实施错了?)【参考方案3】:

您是否收到所有订单(所有具有指定过滤值的订单)?

我意识到我没有收回所有订单,这成功了:

`https://mystorename.myshopify.com/admin/orders.json?status=any`

或者,您可以使用该特定注释查询订单:

`https://mystorename.myshopify.com/admin/orders.json?status=any&note=` + queryItem

【讨论】:

我实际上是从这个开始的,并意识到note=queryItem 会提取所有订单,而不仅仅是带有唯一注释的订单。您是否以未提及的特定方式格式化 queryItem 部分? 啊,看来 shopify 端的 Orders API 可能存在问题。根据文档,这不起作用。您可能想尝试的几件事 (1) 确保您的端点包含 status=any&limit=250 (2) 您的 api 具有对订单的完全访问/范围 - read_all_orders read_orders, write_orders

以上是关于如何过滤 JSON.parse 结果的主要内容,如果未能解决你的问题,请参考以下文章

json.parse和json.stringify

JSON.parse()与JSON.stringify()的区别

JSON.parse()与JSON.stringify()的区别

JSON.parse()与JSON.stringify()的区别

JSON.parse()与JSON.stringify()的区别

JSON.stringify()和JSON.parse()分别是什么