Nano Hash - криптовалюты, майнинг, программирование

Удаление элемента из массива: удаляется неправильный элемент

У меня есть страница сообщений со списком медиа-вложений. Я хочу, чтобы пользователь мог вручную удалить вложение (я), когда он нажимает ссылку «удалить». Однако это событие работает, проблема в том, что удаляется не тот элемент, по которому щелкают! Что я делаю не так?

Вот мой код и живая демонстрация здесь: [codesandbox ] (щелкните ЗАПИСИ -> выберите идентификатор сообщения, чтобы просмотреть сведения о сообщении -> щелкните ИЗМЕНИТЬ сообщение)

EditPost.vue <template> раздел:

...snip..
    <ul>
      <li>Media Attachments
        <template>
          <ul v-if="attachmentsFileNames && attachmentsFileNames.length">
            <li v-for="(mediaAttachment, index) in attachmentsFileNames" :key="index">
              <a href="#">{{ mediaAttachment }}</a>&nbsp;
              <button @click.prevent="deleteMediaAttachment(mediaAttachment, index)">Delete me!</button>
            </li>
          </ul>
          <p v-else>No Media Attachments</p>
        </template>
      </li>
    </ul>

EditPost.vue <script>:

...snip..
data() {
    return {
      post: {},
      editPostFormIsVis: false,
      attachmentsArray: attachments
    };
  },
  created() {
    this.getPost();
  },
  methods: {
    getPost() {
      axios
        .get(
          "https://jsonplaceholder.typicode.com/posts/" + this.$route.params.id
        )
        .then(resp => {
          this.post = resp.data;
        })
        .catch(err => {
          console.log(err);
        });
    },
    editPost() {
      this.editPostFormIsVis = true;
    },
deleteMediaAttachment: function(item, index) {
      if (this.attachmentsArray.attachments[index] === item) {
        // The template passes index as the second parameter to avoid indexOf,
        // it will be better for the performance especially for one large array
        // (because indexOf actually loop the array to do the match)
        this.attachmentsArray.attachments.splice(index, 1);
      } else {
        let found = this.attachmentsArray.attachments.indexOf(item);
        this.attachmentsArray.attachments.splice(found, 1);
      }
    }
  },
  computed: {
    emailAttachmentsFileNames() {
      if (this.attachmentsArray.emailAttachments) {
        const emailAttachmentsFileNameArray = this.attachmentsArray.emailAttachments.map(
          item => {
            const tokens = item.split("/");
            return tokens[tokens.length - 1];
          }
        );
        return emailAttachmentsFileNameArray;
      } else {
        return null;
      }
    },
    attachmentsFileNames() {
      if (this.attachmentsArray.attachments) {
        const attachmentsFileNameArray = this.attachmentsArray.attachments.map(
          item => {
            const tokens = item.split("/");
            return tokens[tokens.length - 1];
          }
        );
        return attachmentsFileNameArray;
      } else {
        return null;
      }
    }
  }
...snip...

  • Удаление происходит поэтапно? Да, похоже, что ошибка разовая, проверьте свою индексацию. 19.08.2019
  • attachmentsFileNames и attachmentsArray не содержат одинаковых элементов, поэтому this.attachmentsArray.attachments.indexOf(item); возвращает -1, поскольку элемент поступает из attachmentsFileNames. 19.08.2019

Ответы:


1

Ваша проблема в том, что вы отправляете элемент из attachmentsFileNames и пытаетесь сопоставить его с элементом в исходном массиве attachments. Первый содержит имя файла, а второй - полный путь, поэтому они не будут совпадать. Например:

console.log(item);                                     // star_wars_luke.jpeg
console.log(this.attachmentsArray.attachments[index]); // attachments/2019/201900002020/star_wars_luke.jpeg

Вот почему this.attachmentsArray.attachments[index] === item равно false, тогда this.attachmentsArray.attachments.indexOf(item) возвращает -1 и, следовательно, this.attachmentsArray.attachments.splice(-1, 1) всегда удаляет последний элемент в массиве.

Поскольку вы сами проанализировали массив attachmentsFileNames из this.attachmentsArray.attachments, вы можете положиться на правильное соответствие index, поэтому эти проверки даже не нужны. Просто удалите их и запустите this.attachmentsArray.attachments.splice(index, 1), и все должно заработать.

19.08.2019

2

Измените функцию deleteMediaAttachment на

deleteMediaAttachment: function(item, index) {
  this.attachmentsArray.attachments.splice(index, 1);
},
19.08.2019
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

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

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

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..