javascript - 如何创建嵌套 For 循环以在我的 Nightmare javascript 代码中输入数据
问题描述
我有两个 JSON 文件。我想比较两个文件中的 JSON 对象;json1 和 json2。如果第一个 json 文件(json1)文件中的数组中存在第二个 json 文件(json2)中不存在的对象,我想通过下面的 Nightmare js 代码将其传递,然后将其推送到第二个 json使用.push()文件。
JS代码:
var Nightmare = require('nightmare');
var nightmare = Nightmare({
show: true
});
var json1 = require('./json1.json')
var json2 = require('./json2.json')
for (var i = 0; i < json1.length; i++) {
for (var c = 0; c < json2.length; c++) {
if (json1[i] !== (json2[c])) {
console.log(json1[i])
return nightmare
.goto(json1[0].searchOn)
.insert('.gLFyf', json1[0].searchText)
.wait(3000)
.end()
.evaluate((json2, json1) => {
return json2[c].push(json1[i])
}, json2, json1)
.then()
} else {
console.log('End!')
}
}
}
JSON1 数据
[
{
"searchOn": "https://www.google.com",
"searchText": "I love google"
},
{
"searchOn": "https://www.google.com",
"searchText": "I'm hungry, where can I eat?'"
}
]
JSON2 数据
[
{
"searchOn": "https://www.google.com",
"searchText": "What's the date?"
},
{
"searchOn": "https://www.google.com",
"searchText": "What is the internet"
},
{
"searchOn": "https://www.google.com",
"searchText": "What's the weather like today?"
}
]
但是,Js 代码给了我这个错误:UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'push' of undefined。
该代码也不会对循环上的所有对象执行噩梦 js 代码(仅对第一项执行任务。
请就如何修复这些错误提出建议。
亲切的问候。
解决方案
多个代码错误之间的相互作用可能难以预测和/或解释。这里有一些要回顾的:
if (json1[i] !== (json2[c]))
json1
和中的条目json2
是由JSON.parse
. 它们总是不同的对象。需要比较它们的原始属性值的相等性,以查看对象是否包含相同的数据。
return nightmare
...
这将在执行此代码的函数中同步返回在 Promise 链末尾返回的未决 Promise then()
,因此仅执行第一个循环迭代。return
需要删除关键字才能完成循环。
json2[c].push(json1[i]
在其中一个回调中
有两个问题:
a) 它是异步执行的。如果return
被删除并且循环完成,c
并且i
分别等于 和 的长度,json2
并且json
如果用作数组索引则返回未定义。这是一个异步编程问题 - 请参阅循环内的 JavaScript 闭包 -解决方案的简单实用示例。
b)json2[c]
是一个普通对象,而不是一个数组,所以它没有push
方法。您可能打算将一个值推到 的末尾json2
,而不是推到其中的条目上。
- 噩梦承诺链上没有
catch
条款。未捕获的 Promise 拒绝错误在未来可能会变得致命。
请注意,我没有确切的理由说明为什么json2[c]
在代码片段中未定义 - 您是引用实际代码而不是发布的缩减示例吗?我还建议将异步函数和await
运算符作为循环异步操作的一种方式。
推荐阅读
- python - 计算特定行的回报
- react-native - 在 React Native 中的导航堆栈上添加哑/展示组件
- python - 如何在Django中序列化后构建对象
- android - 如何设置改造连接超时无限?
- python - 避免在 Python 类中重用慢速函数
- azure - 通过使用 Azure Function 2.x 替代 ExecutionContext.FunctionAppDirectory 的基本文件夹路径
- python - Onchange 和依赖于自身包含 NewObjectId 作为记录的方法
- javascript - 如何使用任何其他关注者列表中的javascript动态单击instagram上的关注按钮?
- java - WSDL 客户端调用失败
- azure-functions - 为什么“重播”的行为可以确保 Azure 持久函数中的可靠执行?