Array.include не работает должным образом с html загрузки файла и localforage - PullRequest
0 голосов
/ 03 марта 2020

Так что в основном я создаю веб-сайт, который позволяет пользователю загружать файл .txt и возвращает его для загрузки после шифрования с использованием шифра сдвига.

У меня есть следующий HTML код

<div class="file-inp mainscreen-row-element level-2 enc">
   Upload Text File
</div>
<input type="file" accept=".txt" id="inp-elem" hidden />

И я храню некоторые данные в indexedDB, если их там еще нет

localforage.getItem("encrypton-caesar-cipher").then(d => {
  if (d == null) {
    localforage.setItem("encrypton-caesar-cipher", {
      enc: { inp: { text: [], files: [] }, out: { text: [], files: [] } },
      dec: { inp: { text: [], files: [] }, out: { text: [], files: [] } },
      ai: { inp: { text: [], files: [] }, out: { text: [], files: [] } }
    });
  }
});

И я javascript включаю этот код

$(".file-inp").on("click", e => {
  $("#inp-elem").trigger("click");
  $("#inp-elem").on("change", () => {
    const f = $("#inp-elem").prop("files");
      localforage.getItem("encrypton-caesar-cipher").then(d => {
        if (!(d.enc.inp.files.includes(f))) {
          d.enc.inp.files.push(f);
          localforage.setItem("encrypton-caesar-cipher", d);
        }
      });
  });
});

Так как пользователь загружает файл, я сохраняю объект в indexedDB с помощью localForage, и у меня есть это условное

if (!(d.enc.inp.files.includes(f)))

, потому что я хочу убедиться, что я не храню один и тот же объект повторно

Теперь, если я загружаю файл a.txt и go в Dev Tools, он отображается там, и если загрузить его снова, мои данные indexedDB не изменяются, чего я и ожидаю, но когда я обновляю sh страницы, а затем снова загрузите a.txt, один и тот же объект сохраняется и отображается в инструментах разработки дважды, и этот показатель продолжает увеличиваться, если я перезагружаю страницу и загружаю тот же файл.

I хочу знать, что я делаю не так или т здесь возможный обходной путь?

1 Ответ

2 голосов
/ 03 марта 2020

Проблема в том, что два javascript объекта с одинаковым содержимым не считаются равными:

const object1 = {foo: 'bar'};
const object2 = {foo: 'bar'};
object1 == object2 // false
// but
object1 == object1 // true

Но это работает для примитивов, таких как строка:

const string1 = 'foo';
const string2 = 'foo';
string1 == string2 // true

Может быть, то, что вы хочу использовать $("#inp-elem").val(), который представляет путь к выбранному файлу, а не сам файл. Вы также можете рассчитать содержимое файла ha sh, если путь не тот, который вы хотите.

...