2017-04-22 55 views
0

我按照有關sort的文檔https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/sort?v=example。它不工作。我甚至得到一個怪異的問題:幾個小時後,我發現如果我將var comparator更改爲function comparator(a,b),它可以工作。這是爲什麼??按屬性排序對象不起作用

test(); 

var comparator = (a, b) => { 
    if (a.min !== b.min) { 
     if (a.min < b.min) { 
      return -1 
     } else { 
      return +1 
     } 
    } else { 
     if (a.max !== b.max) { 
      if (a.max < b.max) { 
       return -1 
      } else { 
       return +1 
      } 
     } else { 
      return 0; 
     } 
    } 
} 
function test() { 
    for (var x = 0; x < 1; x++) { 
     var tests = [{min: 18, max: 20}, 
      {min: 17, max: 20}, 
      {min: 10, max: 11}]; 
     console.log(tests.sort(comparator), 'test sorted'); 
    } 

} 
+2

閱讀了關於可變懸掛 – charlietfl

回答

1

這是因爲變量hoisting問題。您正試圖在定義之前調用函數表達式。當你運行它comparatorundefined

2

如果您將函數test的調用放在最後,它將起作用。這與JavaScript中的hoisting有關。

var comparator = (a, b) => { 
 
    if (a.min !== b.min) { 
 
     if (a.min < b.min) { 
 
      return -1 
 
     } else { 
 
      return +1 
 
     } 
 
    } else { 
 
     if (a.max !== b.max) { 
 
      if (a.max < b.max) { 
 
       return -1 
 
      } else { 
 
       return +1 
 
      } 
 
     } else { 
 
      return 0; 
 
     } 
 
    } 
 
} 
 

 
function test() { 
 
    for (var x = 0; x < 1; x++) { 
 
     var tests = [{min: 18, max: 20}, 
 
      {min: 17, max: 20}, 
 
      {min: 10, max: 11}]; 
 
     console.log(tests.sort(comparator), 'test sorted'); 
 
    } 
 

 
} 
 

 
test();

更新

由於charlietfl指出在他的評論中由於吊裝你的腳本也將工作,如果你的comparator後右移test函數的調用宣言。

var comparator = (a, b) => { 
 
    if (a.min !== b.min) { 
 
     if (a.min < b.min) { 
 
      return -1 
 
     } else { 
 
      return +1 
 
     } 
 
    } else { 
 
     if (a.max !== b.max) { 
 
      if (a.max < b.max) { 
 
       return -1 
 
      } else { 
 
       return +1 
 
      } 
 
     } else { 
 
      return 0; 
 
     } 
 
    } 
 
} 
 

 
test(); 
 

 
function test() { 
 
    for (var x = 0; x < 1; x++) { 
 
     var tests = [{min: 18, max: 20}, 
 
      {min: 17, max: 20}, 
 
      {min: 10, max: 11}]; 
 
     console.log(tests.sort(comparator), 'test sorted'); 
 
    } 
 

 
}

+0

也可以把它放在函數聲明之前,因爲將要懸掛 – charlietfl

+0

@charlietfl正確!感謝您指出這一點。我剛剛更新了我的答案。 – Christos