2011-04-15 38 views
1

以下聲明函數的參數是代碼:爲什麼如果我傳遞的對象變成一個功能,我不需要在JavaScript

function createComparisonFunction(propertyName){ 

     return function(object1, object2){ 
      var value1 = object1[propertyName]; 
      var value2 = object2[propertyName]; 

      if(value1 < value2){ 
       return -1; 
      }else if(value1 > value2){ 
       return 1; 
      }else{ 
       return 0; 
      } 
     }; 
    } 

    var data = [{name: "Zachary", age: 28}, {name: "Nicholas", age: 29}]; 

    data.sort(createComparisonFunction("name")); 
    alert(data[0].name); 

    data.sort(createComparisonFunction("age")); 
    alert(data[0].name); 

正如你可以看到createCompatisonFunction填充值爲叫名和你可以看到這個函數裏面有object1和object2。我可以問一下這些論點通過什麼?你抓住我了嗎?

回答

3

當對data中的元素進行排序時,排序算法將不得不在兩個元素之間進行基本比較以確定哪一個比另一個要大。數組對象的方法sort向比較函數提供它想要比較的兩個對象。基本上你正在爲你的對象定義一個<排序算子。

2

Array.prototype.sort接受被定義爲這樣

function(left, right) { 
    return new Number(); 
} 

分選函數傳遞所述陣列的兩個元素的功能,並返回一個數說明,其中爲了他們應該去。

如果左邊的元素需要在右邊之前去,那麼只需返回-1,否則返回1如果右邊應該在左邊之前出現。

return 0如果沒關係。

在你的情況下,object1object2分別是{name: "Zachary", age: 28}{name: "Nicholas", age: 29}

1

您對函數createComparisonFunction的代碼是返回函數的函數。

在本質上你的代碼是沒有什麼不同比下面向外擴張:

var data = [{name: "Zachary", age: 28}, {name: "Nicholas", age: 29}]; 

data.sort(function(object1, object2){ 
    var value1 = object1["name"]; 
    var value2 = object2["name"]; 
    if(value1 < value2){ 
    return -1; 
    }else if(value1 > value2){ 
    return 1; 
    }else{ 
    return 0; 
    } 
}); 

alert(data[0].name); 

data.sort(function(object1, object2){ 
    var value1 = object1["age"]; 
    var value2 = object2["age"]; 
    if(value1 < value2){ 
    return -1; 
    }else if(value1 > value2){ 
    return 1; 
    }else{ 
    return 0; 
    } 
}); 
alert(data[0].name); 

和創建createComparisonFunction(propertyName)的目的是重構複製並粘貼代碼到一個區域允許的代碼更容易管理。還要注意,如果你的數據對象還包含稱爲「lastname」的propery,那麼這個函數也可以用於按姓氏排序。基本上,這個函數比複製和粘貼代碼更強大。

相關問題