За последние 24 часа нас посетили 46659 программистов и 1272 робота. Сейчас ищут 1018 программистов ...

Как правильно организовать удаление элементов массива?

Тема в разделе "JavaScript и AJAX", создана пользователем bikerlex, 11 май 2015.

  1. bikerlex

    bikerlex Активный пользователь

    С нами с:
    2 дек 2014
    Сообщения:
    344
    Симпатии:
    40
    Поскольку мануалы по чистому js ещё не курил, то возникли сложности.
    Делаю загрузку фоток средствами HTML5 File API. С выводом миниатюр и предвалительным удалением "лишних" фото.
    Разметка:
    Код (PHP):
    1. <div id="wrap">
    2.     <input type="file" id="fileInput" multiple accept="image/*" style="display:none" onchange="handleFiles(this.files)">
    3.     <div id="fileSelect">Щелкните здесь, либо перетащите сюда файлы.</div>
    4.     <button onclick="onclickUpload()">Загрузить</button>
    5.     <div id="fileOutput"></div>
    6. </div>
    Вот собственно сама функция обработки выбранных файлов и вывода миниатюр:
    Код (PHP):
    1. function handleFiles(files) { // в функцию передаются файлы как выбранные через выбор файлов, так и при перетаскивании
    2.         var listFiles = files;
    3.         for(i=0; i<listFiles.length; i++){
    4.             if (listFiles[i].type == 'image/jpeg' || listFiles[i].type == 'image/png'){
    5.                 filesArray = filesArray.concat(listFiles[i]); // Собираю все выбранные файлы в один массив.
    6.             }
    7.         }
    8.  
    9.         var oldThumb = document.querySelectorAll(".thumb");
    10.  
    11.         if(oldThumb.length != 0) {
    12.             document.getElementById('fileOutput').innerHTML = ''; // Если миниатюры уже есть, я их удаляю, чтобы заново их вывести вместе с ещё выбранными.
    13.         }
    14.  
    15.         for(i=0; i<filesArray.length; i++){
    16.  
    17.             var reader = new FileReader();
    18.  
    19.             reader.onload = (function(theFile) {
    20.                 return function(event) {
    21.                     var span = document.createElement('span');
    22.                     span.innerHTML = ['<div class="del"></div><img class="thumb" data-item="',i,'" src="', event.target.result,'"/>'].join('');
    23.                     document.getElementById('fileOutput').insertBefore(span, null);
    24.                 };
    25.             })(filesArray[i]);
    26.  
    27.             reader.readAsDataURL(filesArray[i]);
    28.         }
    29.     }
    Вывод миниатюр работает почти как надо, за исключением того, что в массиве filesArray они сортируются по имени выбранного файла. И потом при выводи миниатюр встают не в том порядке, в котором я их выбираю. Побороться с этим не получается.
    И ещё момент, пока не реализованный. Как организовать удаление элемента массива по нажатию на блок <div class="del"></div>. Скорее даже вопрос в другом, как определить, что я удаляю нужный элемент. Думал в цикле data-item присваивать порядковый номер. По нему определять по какой картинке щелкнул, но и тут возникла проблема, в data-item попадает последнее значение i, хотя всё вроде в цикле.
    Хотелось бы комментариев, конструктивной критики и советов по скрипту. :)
     
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Особенность оптимизации массивов в JS - они автосортирующиеся. Доверяться им в плане порядка ввода нельзя ни в коем случае. Мало того, что они самосортируются, так еще и сама сортировка зависит от браузера и, соответственно, его JS-движка. Исключение - если фигачить строго индексы от 0 и далее. То есть, уже в порядке сортировки. Но тогда можно забыть об произвольных ключах и юзании хэштаблиц.

    Но это разруливается за счет использования двух массивов.
    Первый массив хранит любо удобный тебе ключ и ссылку на хранимый объект.
    Второй массив хранит строго числовые индексы в качестве ключа, в то время, как в качестве значения у него ключи из первого массива.

    Таким образом, первый массив реализует само хранение данных, а второй отвечает за их порядок.
    в итоге, при проходе через for и выборке arr1[arr2], ты будешь получать элементы arr1 в правильном порядке.

    Самому пришлось об это головой удариться, когда понял, что нельзя просто взять и собрать Z-Buffer для спрайтового движка из одного массива.
    Это, конечно, если не нужен доступ по строковым ключам..
    Добавлено спустя 4 минуты 46 секунд:
    array.splice
    array.slice
    Функции для вставки и коррекции массивов в JS. Если делать без них, руками, то будет боль.

    Напиши в самом начале скрипта, до всего кода строчку
    Код (Text):
    1. "use strict";
    Как есть, с кавычками.
    Это и будет тебе критикой, когда все работать перестанет резко. А оно перестанет, я гарантирую это.