Перебрать 2 массива и найти различия с поворотом - PullRequest
0 голосов
/ 27 июня 2019

Ладно, для меня это довольно тяжело обернуть голову, так что я надеюсь, что один из вас, ребята, сможет помочь.Немного контекста, это для написанного мной средства обновления, которое берет список файлов xml из cdn, а затем сравнивает его со старым списком, чтобы найти различия в файлах, так что я знаю, какие файлы устарели и должны быть перезагружены.Сейчас я не могу найти правильное решение для этого.

В настоящее время у меня есть 3 массива.Array1, Array2 и DiffArray.Array1 хранит записи в формате xml из CDN. На главном устройстве Array2 хранит старые записи того, что у нас есть в настоящее время. На ведомом устройстве Array3 хранятся различия того, что изменилось между 2.

Вот примерный битинформации, которая находится в каждом массиве.Обратите внимание, что каждая новая строка разбирается в отдельный индекс соответствующего массива

Array1:

cbt/ar/816.mp3
2019-06-05T16:40:33.212Z
cbt/ar/817.mp3
2019-06-05T16:40:31.509Z
cbt/ar/818.mp3
2019-04-05T16:40:30.978Z
cbt/ar/819.mp3
2019-04-05T16:40:29.807Z

Array2:

cbt/ar/816.mp3
2019-04-05T16:40:33.212Z
cbt/ar/817.mp3
2019-04-05T16:40:31.509Z
cbt/ar/818.mp3
2019-04-05T16:40:30.978Z
cbt/ar/819.mp3
2019-04-05T16:40:29.807Z

пару вещей на заметку: 1.) это список имени файла и даты его последнего изменения 2.) Как видите, массив1 имеет новый файл для 816.mp3 и 817.mp3

Идея состоит в том, чтобы увидеть, чтоОбратите внимание, что файлы отличаются, а затем повторно загрузите эти файлы с более свежей версией.

Это то, что у меня есть в настоящее время, но, как вы можете видеть, это не правильное решение для работы:

var a = [];
      for (var x = 0; x < remoteArray.length; x++) {
        a[remoteArray[x]] = true;

      }

      for (var y = 0; y < localArray.length; y++) {
        if (a[localArray[y]]) {
          delete a[localArray[y]];
        } else {
          a[localArray[y]] = true;
        }
      }

      for (var z in a) {
        diffArray.push(z);
        log.info("::DIFFERENCES::" + z);
      }
    }

Этот текущий код выводит только реальные буквальные различия и не помогает мне узнать, какой файл отличается, так что я могу его обновить

Ответы [ 2 ]

1 голос
/ 27 июня 2019

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

function transformFilesList(array) {
    var files = [];
    for (var i = 0; i < array.length; i += 2) {
        files.push({
            name: array[i],
            modified: array[i + 1]
        });
    }
    return files;
}

var remote = transformFilesList(remoteArray);
var local = transformFilesList(localArray);
var needsDownload = remote.filter(file => {
    let match = local.find(localFile => localFile.name === file.name);
    // We need to download if there is no local file with this name or its modification date is older than the remote one
    return !match || match.modified < file.modified;
});

console.log('List of files to (re)download', needsDownload);
// Each file in this list will be an object { name, modified }

Если вы не можете использовать такие функции, как Array.prototype.filter или функции стрелок (старые браузеры или версии Node), старая альтернативаget needsDownload будет:

var needsDownload = [];
for (var i = 0; i < remote.length; i++) {
    var found;
    for (var j = 0; j < local.length; j++) {
        if (remote[i].name === local[j].length) {
            found = local[j];
            break;
        }
    }
    if (!found || found.modified < remote[i].modified) {
        needsDownload.push(found);
    }
}
1 голос
/ 27 июня 2019

Не уверен, что это тот формат, в котором вы хотите получить результат, но он определяет, какие файлы необходимо обновить:

# Make a dictionary matching each cdn file to its timestamp
cdn = {}
for i in range(0,len(Array1),2):
    cdn[Array1[i]] = Array1[i+1]

# Make an array of files needing to be updated
update = []
for i in range(0,len(Array2),2):
    path = Array2[i]
    # If file is in CDN and the one there is newer, add it to update
    if path in cdn and cdn[path] > Array2[i+1]:
        update.append( path )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...