Сортировка данных списка файлов без ввода формы

#jquery #arrays #sorting #filelist

#jquery #массивы #сортировка #список файлов

Вопрос:

Я довольно новичок в понимании Javascript, Jquery и PHP. На данный момент я потратил около 80 часов, работая над пониманием этого исправления, и я надеюсь получить некоторое представление. Я работаю с этой функцией перетаскивания изображений, и мне нужно отсортировать элементы изображения в объекте FileList в алфавитно-цифровом порядке по их локальному имени файла, чтобы они совпадали с организационной системой базы данных фотографий. Я понимаю, что объект FileList доступен только для чтения, поэтому я предполагаю, что это достигается путем добавления этих элементов в их собственный массив для сортировки или сравнения.

Используя этот код,

 files = e.dataTransfer.files;
newFiles = Array.from(files).map(({name}) => name);
            newFiles.sort();
    console.log(files);
    console.log(newFiles);
 

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

Я пытался использовать этот .slice метод:

 files = [].slice.call(files);
 

Но, похоже, я не могу запустить код. Изображения загружаются как обычно, без сортировки.

То же самое относится и к этому методу:

 files = [...e.dataTransfer.files].sort();
 

Я также попытался использовать рекомендуемый код MDN:

 files.sort((a, b) => a.localeCompare(b, navigator.languages[0] || navigator.language, {numeric: true, ignorePunctuation: true}));
 

но когда я пытаюсь реализовать это исправление, консоль возвращает, что localeCompare не является функцией.

Я также изучал возможность использования natural compare lite Лаури Рудена и jsrender Бориса Мура, но я не понимаю, как реализовать эти плагины.

Я начал писать итератор, чтобы определить, можно ли сравнивать и сортировать два массива как таковые, и мне, честно говоря, просто интересно, на правильном ли я пути?

 for (i=0; i < files.length; i  ) {
                      if (files.name[i] === newFiles[i]) {
                 files.splice(i, 1, newFiles[i]) }
             else{i  ;
       }
 

У меня возникли некоторые проблемы с внутренней ошибкой сервера в PHP, но если обычный код работает с ошибкой на месте, может ли это быть чем-то, что мешает FileList сортировке объекта?

Вот скрипка с кодом. PHP закомментирован ниже HTML, поэтому код вообще не запускается, а iframe Javascript разделен на 3 раздела, разделенных комментариями. Я знаю, что этот пост длинный, и есть много внешних источников, но я хотел убедиться, что я был тщательным в своем объяснении. Если у вас есть какие-либо советы для начинающего веб-разработчика (кроме выхода ^_^;), Я был бы очень признателен! Заранее благодарю вас! 🙂

Комментарии:

1. «Мне нужно отсортировать элементы изображения внутри объекта FileList». Почему?

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

3. Это не отвечает на вопрос «почему?» Возможно, вы не знаете, потому что нет необходимости сортировать этот список.

4. Нет, вам нужно только отсортировать список имен, а затем извлечь файлы из списка файлов в таком порядке.

5. Тем не менее, я бы заказал список на стороне сервера. Представьте, что пользователь загружает свои файлы несколькими пакетами. Разве вы не хотите, чтобы все его / ее файлы были отсортированы?

Ответ №1:

Спасибо за твой совет, Джерард! В итоге я нажал кнопку для сортировки фотографий с помощью многомерного массива на основе идентификатора после того, как фотографии были добавлены:

HTML:

 <div class="dontprint">
            <input TYPE="button" onclick="sortFunction()" id="sortButton" class="sortButton" value=" Sort ">
            <input TYPE="button" value=" Shortcut to Print! " onclick="printpage()" />
            <INPUT TYPE="button" onclick="history.go(0)" value=" Clear ">
        </div>
 

Javascript:

 /* ---------------------------Added to index.html as script tag------------------------ */
//Called on Button Click
function sortFunction() {

//Grab images, array them
const pulled = document.getElementsByClassName("postedImage");
imageObjects = Array.prototype.slice.call(pulled);
    
//Store current image ID amp; Image Source in their own Arrays
var imageIdArray = [];
var imageSrcArray = [];
   for (let i = 0; i < imageObjects.length; i  ) {
        imageSrcArray.push(imageObjects[i].currentSrc);
        imageIdArray.push(imageObjects[i].id);
        }  

//Adopt a multidimensional Array to associate Image ID with Image Source 
var multiArray = [];
   for (var i=0; i<imageIdArray.length amp;amp; i<imageSrcArray.length; i  )
       {multiArray[i] = [imageIdArray[i], imageSrcArray[i]];
            }

//Sort imageObjects (multiArray) alphanumerically
    multiArray.sort(function(a, b) {
        if(a[0] > b[0]) {return 1;}
        if (a[0] < b[0]) {return -1;}
            });

//Sort Image ID's
imageIdArray.sort();

//Change image name on page
   var currentName = document.getElementsByClassName('name');
   var currentLink = document.getElementsByClassName('postedImage');
       for (let i = 0; i < currentName.length; i  ) {
           var newerName = imageIdArray[i];
           currentName[i].innerHTML = newerName;
           }

//Change image on page
//(Caution: Shuffles image sources when button is clicked more than once. Unsure why.)
   for (let i = 0; i < currentLink.length; i  ) {
        var newLink = multiArray[i][1];
        currentLink[i].src = newLink;
        }
}

/*-----------------------------Update these parts in script.js--------------------------*/
uploadStarted:function(i, file, len){
            createImage(file);
            $.data(file).find('.name').text(file.name);
            //Give each file an ID representative of its name
            document.getElementById('sortId').id = file.name;
        },

        progressUpdated: function(i, file, progress) {
            $.data(file).find('.progress').width(progress);
            
        }
         
    });

//Gave the image an ID and a Class for easy grabbing
    var template = '<div class="preview">' 
                        '<span class="imageHolder">' 
                            '<img / id="sortId" class="postedImage">' 
                            '<span class="uploaded"></span>' 
                        '</span>' 
                        
                            '<div class="name"></div>' 
                            
                        '</div>' 
                    '</div>';
};
 

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