Ramda - 按索引分区
Ramda - Partition by index
如何使用 RamdaJS 通过 index
实现 partition
?
/*
* @param {number} index
* @param {[]} list
* @returns {[found, rest[]]} - array whose index 0 has the found element
* * and index 1 has the rest of the given list
*/
const partitionByIndex = (index, list) => {};
// this is what I got so far, but I really think it is too verbose
export const partitionByIndex = R.curry((i, cards) => R.pipe(
R.partition(R.equals(R.nth(i, cards))),
([found, rest]) => [R.head(found), rest],
)(cards));
const list = [1, 2, 3, 4, 5, 6, 7];
const index = 1;
const [found, rest] = partitionByIndex(index, list);
console.log({ found, rest });
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.js"></script>
另一种做法是R.take
和R.drop
围绕R.nth
元素,如:
R.converge(R.pair, [R.nth, (n, xs) => R.concat(R.take(n, xs), R.drop(n + 1, xs))])
或者没有 Ramda:
(n, xs) => [xs[n], xs.slice(0, n).concat(xs.slice(n + 1))]
一个相当简单的无点解决方案是
const partitionByIndex = converge(pair, [compose(of, nth), flip(remove)(1)])
partitionByIndex(2, ['a', 'b', 'c', 'd', 'e']) //=> [['c'], ['a', 'b', 'd', 'e']]
flip
让我意识到 remove
的参数可能顺序错误。
更新
Yogi 指出期望的响应可能是 ['c', ['a', 'b', 'd', 'e']]
而不是上面的结果:[['c'], ['a', 'b', 'd', 'e']]
。如果是这样的话,这段代码可以变得更简单:
const partitionByIndex = converge(pair, [nth, flip(remove)(1)])
partitionByIndex(2, ['a', 'b', 'c', 'd', 'e']) //=> ['c', ['a', 'b', 'd', 'e']]
如何使用 RamdaJS 通过 index
实现 partition
?
/*
* @param {number} index
* @param {[]} list
* @returns {[found, rest[]]} - array whose index 0 has the found element
* * and index 1 has the rest of the given list
*/
const partitionByIndex = (index, list) => {};
// this is what I got so far, but I really think it is too verbose
export const partitionByIndex = R.curry((i, cards) => R.pipe(
R.partition(R.equals(R.nth(i, cards))),
([found, rest]) => [R.head(found), rest],
)(cards));
const list = [1, 2, 3, 4, 5, 6, 7];
const index = 1;
const [found, rest] = partitionByIndex(index, list);
console.log({ found, rest });
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.js"></script>
另一种做法是R.take
和R.drop
围绕R.nth
元素,如:
R.converge(R.pair, [R.nth, (n, xs) => R.concat(R.take(n, xs), R.drop(n + 1, xs))])
或者没有 Ramda:
(n, xs) => [xs[n], xs.slice(0, n).concat(xs.slice(n + 1))]
一个相当简单的无点解决方案是
const partitionByIndex = converge(pair, [compose(of, nth), flip(remove)(1)])
partitionByIndex(2, ['a', 'b', 'c', 'd', 'e']) //=> [['c'], ['a', 'b', 'd', 'e']]
flip
让我意识到 remove
的参数可能顺序错误。
更新
Yogi 指出期望的响应可能是 ['c', ['a', 'b', 'd', 'e']]
而不是上面的结果:[['c'], ['a', 'b', 'd', 'e']]
。如果是这样的话,这段代码可以变得更简单:
const partitionByIndex = converge(pair, [nth, flip(remove)(1)])
partitionByIndex(2, ['a', 'b', 'c', 'd', 'e']) //=> ['c', ['a', 'b', 'd', 'e']]