Parcourir la source

Merge pull request #2591 from posva/feature/sort-filter

orderBy can take a Function as its first argument
Evan You il y a 10 ans
Parent
commit
74e594b0b9
2 fichiers modifiés avec 26 ajouts et 2 suppressions
  1. 7 2
      src/filters/array-filters.js
  2. 19 0
      test/unit/specs/filters/filters_spec.js

+ 7 - 2
src/filters/array-filters.js

@@ -74,16 +74,21 @@ export function filterBy (arr, search, delimiter) {
 /**
  * Filter filter for arrays
  *
- * @param {String|Array<String>} sortKeys
+ * @param {String|Array<String>|Function} sortKeys
  * @param {Number} [order]
  */
 
 export function orderBy (arr, sortKeys, order) {
   arr = convertArray(arr)
   order = (order && order < 0) ? -1 : 1
+  let recursiveCompare = null
 
   if (typeof sortKeys === 'string') {
     sortKeys = [sortKeys]
+  } else if (typeof sortKeys === 'function') {
+    recursiveCompare = function (a, b) {
+      return sortKeys(a, b) * order
+    }
   } else if (!sortKeys || (sortKeys !== true && !sortKeys.length)) {
     // we check if sortKeys === true because you can sort primitive values with
     // array | orderBy true: http://vuejs.org/api/#orderBy
@@ -101,7 +106,7 @@ export function orderBy (arr, sortKeys, order) {
     return a === b ? 0 : a > b ? order : -order
   }
 
-  function recursiveCompare (a, b, i) {
+  recursiveCompare = recursiveCompare || function (a, b, i) {
     i = i || 0
     if (sortKeys === true || i === sortKeys.length - 1) {
       return compare(a, b, i)

+ 19 - 0
test/unit/specs/filters/filters_spec.js

@@ -264,8 +264,27 @@ describe('Filters', function () {
     res = filter(arr, ['a', 'b'], -1)
     assertArray(res, [arr[2], arr[0], arr[3], arr[1], arr[5], arr[4]])
   })
+
+  it('orderBy using a compare function', function () {
+    var filter = filters.orderBy
+    var arr = [9, 11, 1, 2]
+    var res = filter(arr, evenBeforeOdd)
+    assertArray(res, [arr[3], arr[2], arr[0], arr[1]])
+    res = filter(arr, evenBeforeOdd, 1)
+    assertArray(res, [arr[3], arr[2], arr[0], arr[1]])
+    res = filter(arr, evenBeforeOdd, -1)
+    assertArray(res, [arr[1], arr[0], arr[2], arr[3]])
+  })
 })
 
+function evenBeforeOdd (a, b) {
+  if (a % 2 === 0) {
+    if (b % 2 === 0) return a - b
+    else return -1
+  } else if (b % 2 === 0) return 1
+    else return a - b
+}
+
 function assertArray (res, expectations) {
   expect(res.length).toBe(expectations.length)
   expectations.forEach(function (exp, i) {