[removed] Make an array of value pairs form an array of values

前端 未结 8 1744
灰色年华
灰色年华 2021-01-06 08:40

Is there an elegant, functional way to turn this array:

[ 1, 5, 9, 21 ]

into this

[ [1, 5], [5, 9], [9, 21] ]

I kn

8条回答
  •  说谎
    说谎 (楼主)
    2021-01-06 09:08

    Here's slide which has two parameters to control the size of the slice and how many elements are dropped between slices

    slide differs from other answers here by giving you these control parameters. other answers here are limited to producing only a slices of 2, or incrementing the slice by 1 each time

    // take :: (Int, [a]) -> [a]
    const take = (n, xs) =>
      xs.slice(0, n)
    
    // drop :: (Int, [a]) -> [a]
    const drop = (n, xs) =>
      xs.slice(n)
      
    // slice :: (Int, Int, [a]) -> [[a]]
    const slide = (m, n, xs) =>
      xs.length > m
        ? [take(m, xs), ...slide(m, n, drop(n, xs))]
        : [xs]
        
    const arr = [0,1,2,3,4,5,6]
    
    // log helper improves readability of output in stack snippet
    const log = x => console.log(JSON.stringify(x))
    
    log(slide(1, 1, arr))
    // [[0],[1],[2],[3],[4],[5],[6]]
    
    log(slide(1, 2, arr))
    // [[0],[2],[4],[6]]
    
    log(slide(2, 1, arr))
    // [[0,1],[1,2],[2,3],[3,4],[4,5],[5,6]]
    
    log(slide(2, 2, arr))
    // [[0,1],[2,3],[4,5],[6]]
    
    log(slide(3, 1, arr))
    // [[0,1,2],[1,2,3],[2,3,4],[3,4,5],[4,5,6]]
    
    log(slide(3, 2, arr))
    // [[0,1,2],[2,3,4],[4,5,6]]
    
    log(slide(3, 3, arr))
    // [[0,1,2],[3,4,5],[6]] 

    If for some reason you didn't want slide to include partial slices, (slices smaller than m), we could edit it as such

    // slice :: (Int, Int, [a]) -> [[a]]
    const slide = (m, n, xs) =>
      xs.length > m
        ? [take(m, xs), ...slide(m, n, drop(n, xs))]
        : [] // <- return [] instead of [xs]
    
    log(slide(2, 2, arr))
    // now prints: [[0,1],[2,3],[4,5]]
    // instead of: [[0,1],[2,3],[4,5],[6]]
    

提交回复
热议问题