2016-02-25 1 views
4

У меня есть массив объектов, как этотСортировка массив объектов со свойством, имеющей точкой разделенного номера

var arr = [{ 
    "id": "1", 
    "Title": "Object1", 
    "SectionId": "1.2.1" 
}, { 
    "id": "2", 
    "Title": "Object2", 
    "SectionId": "1.1.2" 
}, { 
    "id": "3", 
    "Title": "Object3", 
    "SectionId": "1.0.1" 
}, { 
    "id": "4", 
    "Title": "Object4", 
    "SectionId": "1" 
}]; 

sectionId имеет число разделенных точек. Как отсортировать массив на основе свойства sectionId в порядке возрастания или убывания?

+1

Возможный дубликат [Сортировка массива объектов по значению строки свойства в JavaScript] (http://stackoverflow.com/questions/1129216/ sort-array-of-objects-by-string-property-value-in-javascript) – A1rPun

+0

Посмотрите на это https://jsfiddle.net/62cuna7w/2/ – Ionut

ответ

2

Вдохновленный Sorting with map

function customSort(d, order) { 
 
    var sort = { 
 
      asc: function (a, b) { 
 
       var l = 0, m = Math.min(a.value.length, b.value.length); 
 
       while (l < m && a.value[l] === b.value[l]) { 
 
        l++; 
 
       } 
 
       return l === m ? a.value.length - b.value.length : a.value[l] - b.value[l]; 
 
      }, 
 
      desc: function (a, b) { 
 
       return sort.asc(b, a); 
 
      } 
 
     }, 
 

 
     // temporary array holds objects with position and sort-value 
 
     mapped = d.map(function (el, i) { 
 
      return { index: i, value: el.SectionId.split('.').map(Number) }; 
 
     }); 
 

 
    // sorting the mapped array containing the reduced values 
 
    mapped.sort(sort[order] || sort.asc); 
 

 
    // container for the resulting order 
 
    return mapped.map(function (el) { 
 
     return d[el.index]; 
 
    }); 
 
} 
 

 
var arr = [{ "id": "1", "Title": "Object1", "SectionId": "1.2.1" }, { "id": "2", "Title": "Object2", "SectionId": "1.1.2" }, { "id": "3", "Title": "Object3", "SectionId": "1.0.1" }, { "id": "4", "Title": "Object4", "SectionId": "1.1.10" }, { "id": "5", "Title": "Object5", "SectionId": "1" }]; 
 

 
document.write('<pre>sorted array asc ' + JSON.stringify(customSort(arr), 0, 4) + '</pre>'); 
 
document.write('<pre>sorted array desc ' + JSON.stringify(customSort(arr, 'desc'), 0, 4) + '</pre>'); 
 
document.write('<pre>original array ' + JSON.stringify(arr, 0, 4) + '</pre>');

1
var sort = function(isAsc) { 
    return function(a, b) { 
     var x = a.SectionId.split('.').map(Number) 
     var y = b.SectionId.split('.').map(Number) 
     for (var i = 0; i < 3; i++) { 
      if (x[i] > y[i]) return isAsc ? 1 : -1; 
      if (x[i] < y[i]) return isAsc ? -1 : 1; 
      if (!isNaN(x[i]) && isNaN(y[i])) return isAsc ? 1 : -1; 
      if (isNaN(x[i]) && !isNaN(y[i])) return isAsc ? -1 : 1; 
     } 
     return 0; 
    } 
} 

var acs = sort(true) 
var desc = sort() 

arr.sort(acs) 
arr.sort(desc) 
+0

, это не проблема, оно сортирует '1.1.10 'перед' 1.1.2', из-за строки co mparison. –

+0

@NinaScholz да, вы правы. У меня есть ответ – isvforall

+0

, это странно, не так ли? –

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