如何过滤 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 found
或bargle
错误(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¬e=` + 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()的区别