繁体   English   中英

嵌套对象的 Ramda 排序数组

[英]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组合函数fg以产生一个新函数。 要在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM