首页
学习
活动
专区
圈层
工具
发布

拉姆达
EN

Stack Overflow用户
提问于 2021-04-10 02:35:57
回答 4查看 1.2K关注 0票数 1

在这种情况下,我需要按名称对一个对象数组进行排序。

代码语言:javascript
复制
    Array = [
           {id: 3d4, name: A2},
           {id: 7b2, name: A1+ Beta},
           {id: 9h5, name: A2 Beta},
           {id: 1x1, name: A1+}
          ]

如何使用Ramda按以下顺序对其进行排序:

  1. A1+
  2. A2
  3. A1+ Beta
  4. A2 Beta

我已经想过按名字的长度分开,然后再订货,但我还是坚持住了。有人能帮我吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2021-04-10 06:14:46

您可以在将数组拆分为R.reverse后,尝试将其反转。

代码语言:javascript
复制
const array = [
 {id: '3d4', name: 'A2'},
 {id: '9hh', name: 'A3 Beta'},
 {id: '7b2', name: 'A1+ Beta'},
 {id: '9h5', name: 'A2 Beta'},
 {id: '1x1', name: 'A1+'},
 {id: '1x2', name: 'A3+'}
];

// pick name and convert to lowercase if required.
const namePropCompose = R.compose(R.toLower, R.prop('name')); 

// split by '+ ' or ' ' and reverse the array.
const splitNameAndReverse = R.compose(R.reverse, R.split(new RegExp('[+]?\\s')));

// finally sort with reversed array
const sortByNameCaseInsensitive = R.sortBy(R.compose(splitNameAndReverse, namePropCompose));

const result = sortByNameCaseInsensitive(array);
console.log(JSON.stringify(result))
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.min.js" integrity="sha512-rZHvUXcc1zWKsxm7rJ8lVQuIr1oOmm7cShlvpV0gWf0RvbcJN6x96al/Rp2L2BI4a4ZkT2/YfVe/8YvB2UHzQw==" crossorigin="anonymous"></script>

为了获得更好的可读性,我把它们都分成了不同的组合。Regex and toLower在这里可能没有那么有用,简而言之,如果您想要在一行中完成所有这些操作的话。

代码语言:javascript
复制
sortBy(compose(reverse, split(' '), prop('name')))
票数 1
EN

Stack Overflow用户

发布于 2021-04-10 03:06:08

在Ramda的文档上找到的,非常简单,您可以使用以下内容创建过滤函数:const sortByNameCaseInsensitive = R.sortBy(R.compose(R.toLower, R.prop('name')));

然后将数组应用到其中,sortByNameCaseInsensitive(arr);

票数 0
EN

Stack Overflow用户

发布于 2021-04-10 10:10:05

我认为['A1+', 'A2', 'A1+ Beta', 'A2 Beta']的排名很武断,可能会建议手动排序优先级。

  1. position数组中查找每个rankscores
  2. 把他们的分数减为a - b

代码语言:javascript
复制
const scores = ['A1+', 'A2', 'A1+ Beta', 'A2 Beta'];

const findScorePriority = R.pipe(
  R.prop('name'),
  R.equals,
  R.findIndex(R.__, scores),
);

const byPriority = R.useWith(
  R.subtract, 
  [findScorePriority, findScorePriority],
);

const data = [
 { id: '3d4', name: 'A2' },
 { id: '7b2', name: 'A1+ Beta' },
 { id: '9h5', name: 'A2 Beta' },
 { id: '1x1', name: 'A1+' },
];

console.log(
  R.sort(byPriority, data),
);
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.js" integrity="sha512-3sdB9mAxNh2MIo6YkY05uY1qjkywAlDfCf5u1cSotv6k9CZUSyHVf4BJSpTYgla+YHLaHG8LUpqV7MHctlYzlw==" crossorigin="anonymous"></script>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67030312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档