2 回答

TA貢獻1828條經驗 獲得超4個贊
使用 R.path 獲取data.age:
const sortByYoungest = R.sortBy(R.path(['data', 'age']))
const people = [{"name":"Emma","data":{"age":70}},{"name":"Peter","data":{"age":78}},{"name":"Mikhail","data":{"age":62}}];
const result = sortByYoungest(people);
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js" integrity="sha256-buL0byPvI/XRDFscnSc/e0q+sLA65O9y+rbF+0O/4FE=" crossorigin="anonymous"></script>
從尼克的答案sortByPath中獲取一頁,您可以使用 R.pipe創建一個可重用的函數:
const sortByPath = R.pipe(R.path, R.sortBy)
const sortByYoungest = sortByPath(['data', 'age'])
const people = [{"name":"Emma","data":{"age":70}},{"name":"Peter","data":{"age":78}},{"name":"Mikhail","data":{"age":62}}];
const result = sortByYoungest(people);
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js" integrity="sha256-buL0byPvI/XRDFscnSc/e0q+sLA65O9y+rbF+0O/4FE=" crossorigin="anonymous"></script>

TA貢獻1877條經驗 獲得超1個贊
當你想按路徑排序時data.age,你可以從你的對象中獲取道具data,使用R.prop它會給你一個對象,然后R.prop()在該對象上再次使用來獲取age屬性。要創建執行此操作的函數,您可以使用R.compose():
const byAge = R.ascend(R.compose(R.prop('age'), R.prop('data')));
const people = [
{ name: 'Emma', data:{ age: 70 }},
{ name: 'Peter', data:{ age: 78 }},
{ name: 'Mikhail', data:{ age: 62 }},
];
const peopleByYoungestFirst = R.sort(byAge, people);
console.log(peopleByYoungestFirst);
//=> [{"name":"Mikhail","data":{"age":62}},{"name":"Emma","data":{"age":70}},{"name":"Peter","data":{"age":78}}]
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js" integrity="sha256-buL0byPvI/XRDFscnSc/e0q+sLA65O9y+rbF+0O/4FE=" crossorigin="anonymous"></script>
要分解上述 compose 函數,假設您有 object obj,即:
obj = { name: 'Emma', data:{ age: 70 }}
表演R.prop('data')(obj)將給予:
{ age: 70 }
由于您對age返回對象的屬性感興趣,您可以再次R.prop('age')在上述對象上運行:
R.prop('age')({age: 70})
這會給70. 所以上面的行可以寫成:
R.prop('age')(R.prop('data')(obj))
^^^^^ f ^^^^^ ^^^^^^ g ^^^^^ ^ x
然而,這個函數的問題是它沒有返回一個我們可以傳遞obj進去的函數70。目前它采用 的形式f(g(x)),通過組合它,我們可以得到 的形式(f.g)(x),其中f.g組合函數f并g產生一個新函數。要在 Ramda 中作曲,我們可以使用R.compose():
R.compose(R.prop('age'), R.prop('data'))(obj)
這可以通過 eta-reduced 去除obj示例中的內容。
這種方法可以推廣到:
const {pipe, split, reverse, map, apply, compose, ascend} = R;
const makeSortFn = compose(ascend, pipe(split('.'), reverse, map(R.prop), apply(compose)));
const byAge = makeSortFn('data.age');
const people = [
{ name: 'Emma', data:{ age: 70 }},
{ name: 'Peter', data:{ age: 78 }},
{ name: 'Mikhail', data:{ age: 62 }},
];
const peopleByYoungestFirst = R.sort(byAge, people);
console.log(peopleByYoungestFirst);
//=> [{"name":"Mikhail","data":{"age":62}},{"name":"Emma","data":{"age":70}},{"name":"Peter","data":{"age":78}}]
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js" integrity="sha256-buL0byPvI/XRDFscnSc/e0q+sLA65O9y+rbF+0O/4FE=" crossorigin="anonymous"></script>
但相反,我更喜歡Ori 的方法,通過拆分字符串可以更容易地概括:
R.sortBy(R.path(path_str.split('.')))
添加回答
舉報