Rumah > Soal Jawab > teks badan
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;
}
}
};
这是红宝书中一个知识点,这段代码不是太明白
过去多啦不再A梦2017-07-05 11:08:44
Ini ialah fungsi alat yang dibuat untuk membandingkan struktur data tertentu. Sebagai contoh, format struktur data ialah:
let arr = [{ name: 'foo', value: 123 }, { name: 'bar', value: 456 }]
Pada masa ini, kaedah sort
am perlu ditulis seperti ini, dalam bentuk:
arr.sort(function (a, b) { return a.value - b.value > 0 ? 1 : -1 })
Masalah dengan kod ini:
Parameter value
dikodkan keras dan mesti dikod semula semasa mengisih medan lain.
Logik mengembalikan 1 / -1 adalah berlebihan dan membosankan.
Secara langsung menulis fungsi tanpa nama untuk pengisihan tidak cukup dibaca pada era Buku Merah Kecil (sekarang terdapat fungsi anak panah, ia sebenarnya bukan masalah besar).
Jadi untuk kes di atas, pengarang Buku Merah mereka bentuk fungsi alat umum untuk menjana fungsi [untuk mengisih medan tertentu]. Ambil perhatian bahawa apabila anda memanggil fungsi utiliti ini, apa yang dikembalikan ialah fungsi baharu, bukan hasil yang diisih (yang dipanggil fungsi tertib lebih tinggi).
Selepas menggunakan pakej ini, kodnya kelihatan seperti:
// 创造一个【根据 value 字段来排序】的函数
let compareFn = createComparisonFunction('value')
// 将创造的函数传入 sort 中作为排序依据
arr.sort(compareFn)
Ini memainkan peranan dalam memudahkan logik perniagaan.
淡淡烟草味2017-07-05 11:08:44
Apa yang saya tidak faham ialah membandingkan saiz atribut tertentu bagi dua objekcreateComparisonFunction("test")({'test': 1}, {"test": 2})
mengembalikan -1
巴扎黑2017-07-05 11:08:44
Apabila memanggil fungsi, lihat dalam dua langkah. Mula-mula, kembalikan hasil perbandingan melalui atribut createComparisonFunction()
传入比较的字段。在createComparisonFunction()
函数内,返回一个匿名函数。同时由于匿名函数处在createComparisonFunction()
内,所以你对createComparisonFunction()
传入的参数propertyName
对匿名函数也有效存在。
通过上一步,你已经得到的匿名函数包含propertyName
,此时你就可以传入你要比较的两个对象,在函数内比较他们的propertyName
.