我有两个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代码(仅对第一项执行任务。
请提供有关如何解决这些错误的建议。
亲切的问候。
答案 0 :(得分:0)
您不能通过索引遍历对象。这将适用于数组,数组是一种对象,其键映射到从0开始的索引。如果要遍历任何对象,请使用Object.keys或for-in运算符。您可以了解如何同时进行here。
关于推送(array method
)也是如此答案 1 :(得分:0)
多个代码错误之间的相互作用可能难以预测和/或解释。这里有一些评论:
if (json1[i] !== (json2[c]))
json1
和json2
中的条目是JSON.parse
创建的对象。它们是总是不同的对象。需要比较它们的原始属性值的相等性,以查看对象是否包含相同的数据。
return nightmare
... 这将在执行该代码的函数中,在承诺链的末尾同步返回then()
返回的待处理的承诺,因此仅执行第一次循环迭代。需要删除return
关键字才能完成循环。
json2[c].push(json1[i]
在其中一个回叫有两个问题:
a)它是异步执行的。如果删除return
并完成循环,则c
和i
分别等于json2
和json
的长度,如果用作数组则返回undefined索引。这是一个异步编程问题-有关解决方案,请参见JavaScript closure inside loops – simple practical example。
b)json2[c]
是一个普通对象,而不是数组,因此它没有push
方法。您可能打算将值推到json2
的末尾,而不是推入其中的条目。
catch
子句。未捕获的承诺拒绝错误将来可能会致命。请注意,我没有确切的理由说明为什么在代码片段中未定义json2[c]
-您是引用实际代码,而不是发布的缩减示例吗?我还建议研究异步函数和await
运算符,以作为循环异步操作的一种方法。