首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >拉姆达等效旋转

拉姆达等效旋转
EN

Stack Overflow用户
提问于 2015-06-04 12:50:04
回答 3查看 565关注 0票数 4

给定像下面这样的旋转函数,使数组旋转一组槽。

是否有一个等价的Ramda.js函数或组合将进行此旋转?

代码语言:javascript
复制
var test = [1,2,3,4,5,6,7,8,9];
function rotate(arr, count) {
    arr = arr.slice();
    while (count < 0) {
      count += arr.length;
    }
    count %= arr.length;
    if (count) {
      arr.splice.apply(arr, [0, 0].concat([].slice.call(arr.splice(arr.length - count, count))));
    }
    return arr;
}

示例

代码语言:javascript
复制
rotate(test, 2) // -> [8, 9, 1, 2, 3, 4, 5, 6, 7]
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-11-15 04:48:29

这里有一个无点的一行,它首先获取计数,然后获取数据,这与ramda的可组合风格一致:

代码语言:javascript
复制
const rotate = pipe(splitAt, reverse, flatten);

当然,您可以始终使用flip(rotate)来获得数据的第一个版本。

更新

对不起,我读得太快了,我认为旋转的方向是正常的,向左方向(如在红宝石中)。这里有一个不同的想法,做的是你的原作:

代码语言:javascript
复制
const rotate = pipe(useWith(splitAt, [negate, identity]), reverse, flatten);
票数 3
EN

Stack Overflow用户

发布于 2015-06-04 14:42:25

这类似于@donnut的回答,但包括处理超过给定列表长度的计数的模算法:

代码语言:javascript
复制
var rotate2 = function(xs, count) {
  var n = -(count % xs.length);
  return R.concat(R.slice(n, Infinity, xs),
                  R.slice(0, n, xs));
};

这里有一个没有突变的等价物,根本不使用Ramda:

代码语言:javascript
复制
var rotate3 = function(xs, count) {
  var n = -(count % xs.length);
  return xs.slice(n).concat(xs.slice(0, n));
};

这两种解决方案都比最初文章中的解决方案具有更强的声明性。

票数 1
EN

Stack Overflow用户

发布于 2015-06-04 13:51:06

你可以试试:

代码语言:javascript
复制
function reverse(arr, count) {
    return R.concat(R.slice(arr.length-count, arr.length, arr),  R.slice(0, arr.length-count, arr));
}

请参阅http://bit.ly/1G90ny8

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

https://stackoverflow.com/questions/30644326

复制
相关文章

相似问题

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