亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

嵌套對象的 Ramda 排序數組

嵌套對象的 Ramda 排序數組

HUH函數 2022-06-09 09:57:45
我正在尋找使用 Ramda 對嵌套對象數組進行排序。我有一個數組:const people = [  { name: 'Emma', data:{ age: 70 }},  { name: 'Peter', data:{  age: 78 }},  { name: 'Mikhail', data:{  age: 62 }},];我想使用 Ramda 對上面的數組進行排序。我得到了這個,但它對我不起作用。您的幫助將不勝感激。
查看完整描述

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>



查看完整回答
反對 回復 2022-06-09
?
冉冉說

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('.')))


查看完整回答
反對 回復 2022-06-09
  • 2 回答
  • 0 關注
  • 129 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號