Как сравнить два объекта в JavaScript?

Я загружаю два BLOB-файла в JavaScript, используя код ниже.

Я хочу сравнить их, чтобы увидеть, если они точно так же.

(blob1 === blob2) возвращает значение false, даже если сообщаемый размер каждого BLOB-объекта составляет 574 байта. Что я делаю неправильно?

  getHTTPAsBlob(url, callback) {
    let cacheBust = Math.random().toString()
    url = url + '?&cachebust=' + cacheBust
    let xhr = new XMLHttpRequest();
    xhr.open('GET', url, true);
    xhr.responseType = 'blob';
    xhr.onload = function (e) {
      if (xhr.status == 200) {
        // get binary data as a response
        let fileData = this.response;
        let contentType = xhr.getResponseHeader("content-type")
        var reader = new FileReader()
        reader.onload = (e) => {
          console.log(reader.result)
          console.log(fileData)
          callback(null, {
              Body: reader.result,
              Blob: fileData,
              ContentType: contentType,
              Etag: null,
              LastModified: null,
            })
        }
        reader.readAsText(fileData)
        } else {
        callback(xhr)
      }
      }
      xhr.send();
    }

4 ответа

Вы должны использовать FileReader, чтобы сравнить их

Документация для FileReader находится на MDN. Посмотрите на методы, чтобы выбрать, что лучше для ваших данных.

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

пример

new Blob([Math.random()]).size == new Blob([Math.random()]).size // true,

Думаю, вам поможет плагин "blob compare". Он может сравнивать размер, тип и так далее. https://www.npmjs.com/package/blob-compare

но я не знаю, идеален ли этот плагин.

Вопрос был задан в контексте JavaScript в браузере, но на случай, если кто-то захочет сравнить большие двоичные объекты в Node.js:

      const areBlobsEqual = async (blob1, blob2) => {
  return !Buffer.from(await blob1.arrayBuffer()).compare(
    Buffer.from(await blob2.arrayBuffer())
  );
};

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

new Number(5) == new Number(5)

Возвращает ложь. Разочарование, что 5 как объект не равняется объекту, значение которого равно 5. Но по крайней мере это помещает Blob в контекст.

Я сталкиваюсь с этой же проблемой, и согласен с предыдущим предложением, что FileReader является единственным вариантом.

Другие вопросы по тегам