相当于旋转的 ramda
ramda equivalent for rotate
给定如下所示的旋转函数,该函数将数组旋转一定数量的槽。
是否有等效的 Ramda.js 函数或组合可以执行此旋转?
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;
}
例子
rotate(test, 2) // -> [8, 9, 1, 2, 3, 4, 5, 6, 7]
你可以试试:
function reverse(arr, count) {
return R.concat(R.slice(arr.length-count, arr.length, arr), R.slice(0, arr.length-count, arr));
}
这类似于@donnut 的回答,但包括模运算以处理超过给定列表长度的计数:
var rotate2 = function(xs, count) {
var n = -(count % xs.length);
return R.concat(R.slice(n, Infinity, xs),
R.slice(0, n, xs));
};
这是一个完全不使用 Ramda 的无突变等价物:
var rotate3 = function(xs, count) {
var n = -(count % xs.length);
return xs.slice(n).concat(xs.slice(0, n));
};
这两种解决方案都比原始 post 中的解决方案更具声明性。
这是一个无点单行代码,它先计算计数再计算数据,与 ramda 的可组合风格一致:
const rotate = pipe(splitAt, reverse, flatten);
当然你可以随时flip(rotate)
获取数据优先版本。
更新
抱歉,我读得太快了,并且假设旋转方向是正常的、向左的方向(例如,在 ruby 中)。这是按照您的原始想法所做的想法的变体:
const rotate = pipe(useWith(splitAt, [negate, identity]), reverse, flatten);
给定如下所示的旋转函数,该函数将数组旋转一定数量的槽。
是否有等效的 Ramda.js 函数或组合可以执行此旋转?
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;
}
例子
rotate(test, 2) // -> [8, 9, 1, 2, 3, 4, 5, 6, 7]
你可以试试:
function reverse(arr, count) {
return R.concat(R.slice(arr.length-count, arr.length, arr), R.slice(0, arr.length-count, arr));
}
这类似于@donnut 的回答,但包括模运算以处理超过给定列表长度的计数:
var rotate2 = function(xs, count) {
var n = -(count % xs.length);
return R.concat(R.slice(n, Infinity, xs),
R.slice(0, n, xs));
};
这是一个完全不使用 Ramda 的无突变等价物:
var rotate3 = function(xs, count) {
var n = -(count % xs.length);
return xs.slice(n).concat(xs.slice(0, n));
};
这两种解决方案都比原始 post 中的解决方案更具声明性。
这是一个无点单行代码,它先计算计数再计算数据,与 ramda 的可组合风格一致:
const rotate = pipe(splitAt, reverse, flatten);
当然你可以随时flip(rotate)
获取数据优先版本。
更新
抱歉,我读得太快了,并且假设旋转方向是正常的、向左的方向(例如,在 ruby 中)。这是按照您的原始想法所做的想法的变体:
const rotate = pipe(useWith(splitAt, [negate, identity]), reverse, flatten);