首页 > 解决方案 > 如何创建嵌套 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 代码(仅对第一项执行任务。

请就如何修复这些错误提出建议。

亲切的问候。

标签: javascriptarraysnode.jsjsonnightmare

解决方案


多个代码错误之间的相互作用可能难以预测和/或解释。这里有一些要回顾的:

  1. if (json1[i] !== (json2[c]))

json1和中的条目json2是由JSON.parse. 它们总是不同的对象。需要比较它们的原始属性值的相等性,以查看对象是否包含相同的数据。

  1. return nightmare...

这将在执行此代码的函数中同步返回在 Promise 链末尾返回的未决 Promise then(),因此仅执行第一个循环迭代。return需要删除关键字才能完成循环。

  1. json2[c].push(json1[i]在其中一个回调中

有两个问题:

a) 它是异步执行的。如果return被删除并且循环完成,c并且i分别等于 和 的长度,json2并且json如果用作数组索引则返回未定义。这是一个异步编程问题 - 请参阅循环内的 JavaScript 闭包 -解决方案的简单实用示例。

b)json2[c]是一个普通对象,而不是一个数组,所以它没有push方法。您可能打算将一个值推到 的末尾json2,而不是推到其中的条目上。

  1. 噩梦承诺链上没有catch条款。未捕获的 Promise 拒绝错误在未来可能会变得致命。

请注意,我没有确切的理由说明为什么json2[c]在代码片段中未定义 - 您是引用实际代码而不是发布的缩减示例吗?我还建议将异步函数和await运算符作为循环异步操作的一种方式。


推荐阅读