2014-05-15 3 views
0

У меня есть код вроде этого.Сортировка данных из json

var a = JSON.parse(data); 
var result = "<table><tr><th></th></tr>"; 
for (i = 0; i < a.DATA.length; i++) { 
    var test = a.DATA[i][0];      
    result += "<tr'><td>" + test + "</td></tr>"; 
} 
result += "</table>" 
$(".show").html(result); 

С этим результатом кода, как это:

e_file.xlsx, 
p_image.png, 
test2.docx, 
test_folder1, 
test_folder2, 
text_file.txt 

Но мне нужно иметь папки (test_folder1, test_folder2) и каждые будущие папки отсортированные перед другими файлами с суффиксом.

Спасибо.

+0

Можете ли вы поместить значение 'data'? – hsz

+0

Во-первых, вам нужно показать данные JSON; 2, неправильная последовательность тегов '. TH не может быть вложен в TR ... – marekful

+1

Вам нужно будет перебрать все данные JSON в массив и отсортировать его, а затем отобразить. – techouse

ответ

0

http://jsfiddle.net/dactivo/tGbYq/

Решение будет развилка на ответ HSZ в.

Разница основана на данных json, которые вы используете. Обычно, если это был массив строк, как в примере hsz, вы получаете доступ напрямую по одному. С использованием json вы должны сначала извлечь часть «DATA» следующим образом: alldata["DATA"], а затем в функции сортировки вместо сравнения непосредственно с «a» и «b» вы должны установить, какое значение сравнить , потому что каждый элемент массива DATA является другим массивом, поэтому мы обращаемся к ним с помощью «a [0]» и «b [0]».

Чтобы решить эту проблему, вы можете продолжать использовать решение hsz, но ваши элементы папок имеют «<dir>» как строку во втором значении, поэтому вы можете использовать это, чтобы обрабатывать их по-разному.

Оба решения в порядке.

var alldata={ "ERROR": "-", "DATA": [[ "e_file.xlsx", "8759"], ["test2.docx", "23794"], ["test_folder1", "<dir>"], ["test_folder2", "<dir>"], ["p_image.png", "2115194"], ["text_file.txt", "19"]]} 

try{ 

data=alldata["DATA"]; 
data.sort(function(a,b) 
     { 
/* 
     //THIS WOULD BE HSZ'S ANSWER 
      var pattern = /\.[a-z]+$/i, 
     isADir = !pattern.test(a[0]), 
     isBDir = !pattern.test(b[0]); 

    if (isADir && !isBDir) return -1; 
    if (isBDir && !isADir) return 1; 

    return a[0] > b[0]; 
    */  

      if (a[1]=="<dir>" && b[1]!="<dir>") return -1; 
      if (a[1]!="<dir>" && b[1]=="<dir>") return 1; 


      return a[0] > b[0]; 

}); 


    var result = "<table><tr><th></th></tr>"; 
for (i = 0; i < data.length; i++) { 
    var test = data[i][0];      
    result += "<tr'><td>" + test + "</td></tr>"; 
} 
result += "</table>" 

} 
catch(e){ 
alert(e); 
} 
$(".show").html(result); 
+0

Это прекрасно работает. Большое спасибо. – user3573096

1

Чтобы отсортировать массив с именами файлов/dirnames вы можете попробовать:

var data = ['e_file.xlsx', 'p_image.png', 'test2.docx', 'test_folder1', 'test_folder2', 'text_file.txt']; 

var sorted = data.sort(function(a, b){ 
    var pattern = /\.[a-z]+$/i, 
     isADir = !pattern.test(a), 
     isBDir = !pattern.test(b); 

    if (isADir && !isBDir) return -1; 
    if (isBDir && !isADir) return 1; 

    return a > b; 
}); 

Выход:

["test_folder1", "test_folder2", "e_file.xlsx", "p_image.png", "test2.docx", "text_file.txt"] 
+0

Когда я пытаюсь этот FireBug сообщает: TypeError : data.sort не является функцией. – user3573096

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