数组末尾的lodash块

时间:2019-03-08 00:12:22

标签: javascript lodash

我有一个数组

const myArray = [1, 2, 2, 2, 3, 3, 3, 4, 4, 4];

我想拆分成较小的数组的

。我正在用lodash块来做。

_.chunk(myArray, 3);

这将返回

[1, 2, 2], [2, 3, 3], [3, 4, 4], [4]

但我希望它返回

[1], [2, 2, 2], [3, 3, 3], [4, 4, 4]

我的解决方法是这个

_.chain(myArray).reverse().chunk(3).reverse().value()

它反转数组,拆分数组,然后再次反转。但是有更好的方法吗?因此,块是从结尾而不是开头开始的。

3 个答案:

答案 0 :(得分:3)

找到remainder,如果还有剩余,请从左侧切成薄片,然后将其与数组其余部分的块合并。如果没有剩余,则正常地进行分块:

const myArray = [1, 21, 22, 23, 31, 32, 33, 41, 42, 43];

const chunkRight = (arr, size) => {
  const rm = arr.length % size;
  
  return rm ?
    [arr.slice(0, rm), ..._.chunk(arr.slice(rm), size)]
    :
    _.chunk(arr, size);
};

const result = chunkRight(myArray, 3);

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>

答案 1 :(得分:1)

对此没有内置参数选项(或诸如chunkEnd之类的单独方法),但是自己编写无需实现reverse即可实现相同功能的东西很简单:

const chunkFromEnd = (arr, size) => {
  const firstSize = arr.length % size;
  const result = [arr.slice(0, firstSize)];
  
  for (let i = firstSize; i < arr.length; i += size) {
    result.push(arr.slice(i, i + size));
  }
  return result;
};
console.log(chunkFromEnd([1, 2, 2, 2, 3, 3, 3, 4, 4, 4], 3));
console.log(chunkFromEnd([1, 2, 2, 2, 3, 3, 3, 4, 9, 4, 4, 6, 2, 1], 3));

答案 2 :(得分:1)

一种替代方法是使用函数reduceRight

const myArray = [1, 2, 2, 2, 3, 3, 3, 4, 4, 4];
const chunks = myArray.reduceRight((a, n, i, arr) => {
  if (((arr.length - 1) - i) % a.chunk === 0) {
    a.current = [];
    a.chunks.unshift(a.current);
  }
  
  a.current.push(n);  
  return a;
}, {
  /*This is the size per chunk*/chunk: 3, 
  /*The array with the chunks*/ chunks: [], 
  /*The current array which is being filled*/ current: []}).chunks;

console.log(chunks);
.as-console-wrapper { max-height: 100% !important; top: 0; }