Nodejs вырваться из l oop с асинхронной / синей птицей? - PullRequest
1 голос
/ 02 апреля 2020

Итак, у меня есть следующий код, который работает, но я бы хотел, чтобы он больше не использовал for-l oop.

Важным моментом является история "перерыва".

    for (const obj of objects) {
        let found = false;

        for (const item of items) {
            const result = item.get(obj);
            if (typeof result !== 'undefined') {
                found = true;
                break;
            }
        }

        if (!found) {
            notDefined.push(obj);
        }
    }

Я пробовал это с Bluebird, но у меня не получается. Array.prototype.forEach не вариант, его нельзя остановить.

Что еще можно попробовать?

РЕДАКТИРОВАТЬ: точка заполняет этот список объектов, "notDefined" , Список представляет элементы, не найденные на карте, которые были заполнены целенаправленно.

Таким образом, куча из них проверяется на совпадение.

Если элемент действительно найден Мы должны перейти к следующей группе. И конечно: прекратите перебирать элементы, потому что мы нашли совпадение, и поэтому нет смысла продолжать. Нет необходимости постоянно проверять все оставшиеся элементы, которые могут составлять несколько сотен тысяч.

EDIT2: Цель этого списка "notDefined" - записать объекты в текстовый файл, который впоследствии можно будет проверить вручную .

Имена переменных были изменены по сравнению с их оригиналами, чтобы иметь здесь что-то другое.

Цель кода - сравнение содержимого нескольких каталогов на одном компьютере с содержимое нескольких каталогов на другом компьютере.

Эти данные представлены в виде нескольких файлов CSV. Все они читаются, и список генерируется для каждого файла CSV. Данные в этом CSV-файле:

  • Абсолютный путь к файлу
  • Размер файла
  • Md5

И некоторые другие метаданные.

Однако этот список каждый раз не содержит просто строки абсолютного пути к файлу, он содержит Map(), ключ - комбинация из трех упомянутых фрагментов данных, чуть выше.

Итак, у нас есть несколько CSV-файлов для машины A, а затем несколько CSV для машины B. И мы sh посмотрим, можно ли найти предметы на машине A и на машине B.

что я пытаюсь сделать здесь: l oop поверх всех CSV и найти подходящие предметы.

Если я найду совпадение, то нет смысла продолжать проверку, и я могу перейти к следующему набору. Отсюда и break;.

Но мне нужно проверять каждое совпадение, а затем записывать результат для всех предметов, которые нигде не найдены.

1 Ответ

0 голосов
/ 05 апреля 2020

Мне кажется, у вас есть два массива, objects и items.

И мне кажется, что вы хотите достойно работающий способ узнать, отсутствует ли каждый объект во всех ваших Картах. Я предполагаю, что ваш интерес к выходу из-за oop является частью вашей стратегии, чтобы заставить это работать достойно.

Могу ли я предложить другой подход? Давайте начнем с создания единого набора всех ключей во всех ваших объектах карты. Примерно так.

const allKeys = new Set()
for (const item of items)
  for (const key of item.keys())
    allKeys.add(key)

Теперь вы пробегаете по одному массиву объектов, один за другим, и выводите sh их в notDefined, если они отсутствуют в наборе allKeys.

for (const obj of objects)
  if (!allKeys.has(obj)) 
    notDefined.push(obj)

Это избавит вас от вложенных итераций на двух массивах. И он работает хорошо, потому что множественный поиск выполняется быстро.

Все вместе, в некоторых идеально синхронных тесных циклах (не нужно обещаний):

const allKeys = new Set()
for (const item of items)
  for (const key of item.keys())
    allKeys.add(key)

for (const obj of objects)
  if (!allKeys.has(obj))
     notDefined.push(obj)

Чтобы сделать это еще быстрее, вы могли бы подумать о создании ваш allKeys установлен, когда вы читаете ваши необработанные данные из ваших файлов CSV. Это спасло бы проход по всем элементам items.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...