[英]Ramda sort array of nested object
我正在寻找使用 Ramda 对嵌套对象数组进行排序。 我有一个数组:
const people = [
{ name: 'Emma', data:{ age: 70 }},
{ name: 'Peter', data:{ age: 78 }},
{ name: 'Mikhail', data:{ age: 62 }},
];
我想使用 Ramda 对数组进行排序。 我得到了这个,但它对我不起作用。
您的帮助将不胜感激。
使用 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>
从Nick 的回答中获取一页,您可以使用sortByPath
创建一个可重用的sortByPath
函数:
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>
由于您想按路径data.age
排序,您可以使用R.prop
从您的对象中获取道具data
,这将为您提供一个对象,然后在该对象上再次使用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 函数,假设您有对象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))
,通过组合它,我们可以得到(fg)(x)
,其中fg
组合函数f
和g
以产生一个新函数。 要在R.compose()
组合,我们可以使用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('.')))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.