如何在JavaScript中创建数组窗口化切片?

时间:2018-09-07 09:22:46

标签: javascript arrays

我正在寻找名为Array.window(n)的数组方法实现,该实现在具有参数n的数组上调用,将给出连续的重叠数组切片。

示例:

let a = [1, 2, 3, 4, 5, 6]
a.window(2) // [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6]]
a.window(3) // [[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6]]
a.window(4) // [[1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6]]
a.window(10)// []

我该怎么做?

3 个答案:

答案 0 :(得分:1)

这里是使用数组函数的示例稍短一些:

let a = [1, 2, 3, 4, 5, 6];
function windowedSlice(arr, size) {
    let result = [];
    arr.some((el, i) => {
        if (i + size >= arr.length) return true;
        result.push(arr.slice(i, i + size));
    });
    return result;
}
console.log(windowedSlice(a, 2));
console.log(windowedSlice(a, 3));
console.log(windowedSlice(a, 4));
console.log(windowedSlice(a, 5));

答案 1 :(得分:0)

我认为就足够了

settings.py

答案 2 :(得分:0)

这是一个简单的滚动窗口功能。请注意,我们可以根据数组长度减去所需的窗口大小来确定迭代次数。

/**
 * Produces a rolling window of desired length {w} on a 1d array.
 * 
 * @param {Array} a The 1d array to window.
 * @param {Number} w The desired window size.
 * @return {Array} A multi-dimensional array of windowed values.
 */
function rolling(a, w) {
    let n = a.length;
    let result = [];

    if (n < w || w <= 0) {
        return result;
    }

    for (let i = 0; i < n - w + 1; i++) {
        result.push(a.slice(i, w + i));
    }

    return result;
}

let a = [1, 2, 3, 4, 5];
console.log(JSON.stringify(rolling(a, 3)));