如何创建一个嵌套循环,以在梦Night javascript代码中输入数据

时间:2018-12-26 21:02:22

标签: javascript arrays node.js json nightmare

我有两个JSON文件。我想比较两个文件中的JSON对象; json1和json2 。如果第一个json文件 (json1) 中的对象不在第二个json文件 (json2) ,我想通过下面的Nightmare js代码将其传递,然后使用 .push()将其推送到第二个json文件中。


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:无法读取未定义的属性“ push”

该代码也不会在循环上的所有对象上执行噩梦js代码(仅对第一项执行任务。

请提供有关如何解决这些错误的建议。

亲切的问候。

2 个答案:

答案 0 :(得分:0)

您不能通过索引遍历对象。这将适用于数组,数组是一种对象,其键映射到从0开始的索引。如果要遍历任何对象,请使用Object.keys或for-in运算符。您可以了解如何同时进行here

关于推送(array method

)也是如此

答案 1 :(得分:0)

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

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

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

  1. return nightmare ...

这将在执行该代码的函数中,在承诺链的末尾同步返回then()返回的待处理的承诺,因此仅执行第一次循环迭代。需要删除return关键字才能完成循环。

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

有两个问题:

a)它是异步执行的。如果删除return并完成循环,则ci分别等于json2json的长度,如果用作数组则返回undefined索引。这是一个异步编程问题-有关解决方案,请参见JavaScript closure inside loops – simple practical example

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

  1. 梦m承诺链上没有catch子句。未捕获的承诺拒绝错误将来可能会致命。

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