2015-05-21 3 views
0

Прямо сейчас в моем коде у меня есть таблица динамически, а затем пользователь вводит некоторые данные в поле в таблице. Впоследствии я хотел бы предоставить пользователю возможность сортировать список на основе этого поля. То, что я хотел бы сделать, это использовать document.getElementsByClassName, чтобы захватить все поля значений, а затем отсортировать их, но сохранить данные объекта так что-то вроде этого.Сортировка document.getElementsByClassName

var posts = document.getElementsByClassName('data'); 
posts.values.sort(); // I'd like to sort the array by the value of the html objects 
for(i=0;i<posts.length;i++){ 
    //modify table order 
} 

ответ

1

Предполагая, что все элементы на posts массива являются входными элементами управления, имеющим свойство value, вы могли бы просто сделать

var arr = Array.prototype.slice.call(document.getElementsByClassName('data')); 
arr.sort(function(a, b) { 
    if (a.value < b.value) { 
     return -1; 
    } 

    if (a.value > b.value) { 
     return 1; 
    } 

    return 0; 
}); 

или даже лучше (спасибо @Phil)

arr.sort(function(a, b) { 
    return a.value.localeCompare(b.value); 
}); 

Примите во внимание, что Я делаю алфавитную сортировку. Вы можете сделать сравнение более appropiated для сценария

+1

AFAIK вы не можете использовать 'sort' непосредственно на коллекции йот, вам не нужно сначала преобразовывать его в массив? –

+0

@ Rob M .: Возможно, вы правы, я не очень привык к 'getElementsByClassName' и предположил, что он возвратил массив. Спасибо за отзыв –

+0

@RobM. верно. Вы можете использовать 'Array.prototype.sort.call (posts, function ...)'. Кроме того, 'return a.value.localeCompare (b.value)' является простым однострочным – Phil

1

document.getElementsByClassName даст вам HTMLCollection объект но не массив и HTMLCollection объекта нет Упорядочить

Таким образом, вы должны изменить его в массив.

var posts = document.getElementsByClassName('data') , arr = []; 
for(var i = 0 ; i < posts.length; i++){ 
    arr.push(posts[i]) 
} 
arr.sort() 
+0

Какие данные будут храниться при нажатии на узел? Просто имя объекта и его данные? – Tyler

+0

Данные, которые вы храните, будут такими же, как и у узла. – Shiyou

1

Вы хотите сначала преобразовать HTMLCollection в массив, а затем отсортировать.

var posts = document.getElementsByClassName('data'); 
var arr = [].slice.call(posts); // convert HTMLColleciton to Array 
arr.sort(); 

EDIT: Сортировать принимает функцию в качестве параметра, который позволит сортировать на основе собственности на массив в

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

Смежные вопросы