Как я могу создать Nested For Loop для ввода данных в мой код JavaScript Nightmare - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть два файла JSON.Я хочу сравнить объекты JSON в обоих файлах; json1 и json2 .Если в первом файле json есть объект в массиве (json1) файл, которого нет во втором файле json (json2) , я хотел бы передать его через приведенный ниже js-код Nightmare, а затем передать объект во второй файл 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: Невозможно прочитать свойство 'push' из неопределенного .

Код также не выполняет js-код кошмара для всех объектов в цикле (выполняет задачу только для первого элемента.

Пожалуйста, посоветуйте, как я могу исправить эти ошибки.

ВидС уважением.

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Взаимодействие между множественными ошибками кода может быть трудно предсказать и / или объяснить.Вот несколько обзоров:

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

Записи в json1 и json2 являются объектами, созданными JSON.parse.Это всегда разные объекты.Сравнение равенства значений их примитивных свойств потребуется для определения, содержат ли объекты одинаковые данные.

return nightmare ...

Это будет синхронно возвращать ожидающее обещание, возвращаемое then() в конце цепочки обещаний, из функции, в которой выполняется этот код, поэтому тольковыполняется первая итерация цикла.Для завершения цикла ключевое слово return необходимо удалить.

json2[c].push(json1[i] в одном из обратных вызовов

имеет две проблемы:

a) он выполняется асинхронно.Если return удаляется и цикл завершается, c и i равны длине json2 и json соответственно и возвращают неопределенное значение, если используются в качестве индексов массива.Это проблема асинхронного программирования - см. Закрытие JavaScript внутри циклов - простой практический пример для решений.

b) json2[c] - это простой объект, а не массив, поэтому он не 'у нас есть push метод.Вы, вероятно, намеревались вставить значение в конец json2, а не в запись в нем.

В цепочке обещаний кошмаров нет пункта catch.Необработанные ошибки отклонения обещания могут стать фатальными в будущем.

Примечание. У меня нет точной причины, по которой json2[c] не определено во фрагменте кода - вы цитируете из фактического кода, а не урезанный пример опубликован?Я также предложил бы рассмотреть асинхронные функции и оператор await как средство циклического выполнения асинхронных операций.

0 голосов
/ 27 декабря 2018

Вы не можете перебрать объект по индексам.Это будет работать с массивами, которые представляют собой тип объекта с ключами, сопоставленными с индексами, начинающимися с 0. Если вы хотите перебрать любой объект, используйте Object.keys или оператор for-in.Вы можете узнать, как сделать оба здесь .

То же самое верно для push, который является методом массива

...