关于满足5的倍数数组判断问题?

var aa = [];
var bb = [];  
for(var i=0;i<6;i++){
    aa.push(i)
    //bb do thing
 }

// 然后 如上 如果循环长度为6的话 我想让bb变量成这样 bb = [[0,1,2,3,4],[5]] 每单个数组五个满的话就换成下个数组 该如何实现??

阅读 3.7k
4 个回答
var aa = [];
var bb = [];  
var t = [];
for(var i=0;i<6;i++){
    aa.push(i);
    t.push(i);
    if(i%5===4) { bb.push(t); t = [];}
 }
bb.push(t);

 // b.length===1 && b = b[0];

代码来了,虽然是个简单问题,写Functional和写流程图方式还是不一样:

var testData = [ 
  [], 
  [0],
  [0, 1], 
  [0, 1, 2, 3, 4], 
  [0, 1, 2, 3, 4, 5], 
  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
]

var falsify = () => false
var group = (n, x) => x.reduce((p,c,i) =>  
  falsify((i%n) ? p[p.length-1].push(c) : p.push([c])) || p, []) 

testData.forEach(data => console.log(group(5, data)))

如果支持spread operator,容易写成pure/immutable的,但效率会有牺牲,不能用于处理太大的数组:

var group2 = (n, x) => x.reduce((p,c,i) => 
  i%n ? [...p.slice(0, -1), [...p.slice(-1)[0], c]] : [...p, [c]], [])

slice 可以拿來切割數組,剛好可以用在這裡

var arr1 = [],
    arr2 = []

const times = 6,
      perGroup = 5

for(let i = 0 ; i < times ; i++) {
    arr1.push(i)
}

for(let i = 0 ; i < arr1.length ; i += perGroup) {
    arr2.push(arr1.slice(i, i + perGroup))
}

console.log(arr1)
console.log(arr2)

實現

function arrGen(total) {
  var arr = [[]]

  for (var i = 0, idx = 0; i < total; i++) {
    if (i && !(i % 5)) arr[++idx] = []
    arr[idx].push(i)
  }

  return arr
}

console.log(arrGen(0))
console.log(arrGen(1))
console.log(arrGen(3))
console.log(arrGen(5))
console.log(arrGen(6))
console.log(arrGen(10))
console.log(arrGen(11))
console.log(arrGen(15))

输出:

[ [] ]
[ [ 0 ] ]
[ [ 0, 1, 2 ] ]
[ [ 0, 1, 2, 3, 4 ] ]
[ [ 0, 1, 2, 3, 4 ], [ 5 ] ]
[ [ 0, 1, 2, 3, 4 ], [ 5, 6, 7, 8, 9 ] ]
[ [ 0, 1, 2, 3, 4 ], [ 5, 6, 7, 8, 9 ], [ 10 ] ]
[ [ 0, 1, 2, 3, 4 ], [ 5, 6, 7, 8, 9 ], [ 10, 11, 12, 13, 14 ] ]
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题