从数组中删除元素以获取JavaScript

时间:2017-01-15 15:41:52

标签: javascript arrays

我的目的是创建一个从数组中删除元素的函数,以将其长度减少到所需的长度。

但条件是它应该以(几乎)相等的间隔移除元素。该函数应该适用于array.length和desired_length的任何值。

例如:

myArray = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19];
desired_length = 7;

myFunction( myArray, desired_length )  //returns  [0, 4, 7, 10, 13, 16, 19]

删除哪些元素无关紧要。但是如果我们在折线图上绘制返回数组的元素,那么该线应该尽可能平滑。

用例:

我有一个包含图像的数组。我想将它们渲染为固定帧数的GIF。因此,如果阵列中有100个图像,我想从中间删除一些图像,因此阵列只有20个图像。现在重要的部分是以相等的间隔移除帧,以便最终的动画尽可能少的生涩。阵列的长度每次都可以变化。

3 个答案:

答案 0 :(得分:2)

你可以使用余数运算符,并通过除去aaray长度和所需长度来检查零。

function getArray(array, length) {
    return array.filter(function (_, i, a) {
        return !(i % (a.length / length));
    });
};

var myArray = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19];

console.log(getArray(myArray, 10)); // [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] 
console.log(getArray(myArray, 5));
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:0)

重要的是step的计算,它可用于迭代原始数组。

编辑:添加Math.round会使代码适用于length / desired_length != 0。你想要的输出很难在我眼中重现。



myArray = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

console.log(myFunction( myArray, 10 )) // [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] 

console.log(myFunction( myArray, 5 )) // [0, 4, 8, 12, 16] 

console.log(myFunction( myArray, 7 )) // [0, 3, 6, 9, 12, 15, 18]

function myFunction( arr, desired_length) {
    var arr_length = arr.length;
    var step = Math.round(arr_length / desired_length);
    var new_arr = [];
    for (var i = 0; i < arr_length; i += step) {
      new_arr.push(arr[i]);
    }
    return new_arr;
}
&#13;
&#13;
&#13;

答案 2 :(得分:0)

解决方案:

// always saves first and last element
function setMaxElements( array, max_elements ) {
    if( array.length > max_elements ) { 
        // Always save first element
        var new_array = [ array[0] ];

        // index of last saved element
        var last_saved_element = 0;

        for( var i = 1; i < array.length; i++ ) {
            // (array.length-1) & (max_elements-1) because we already saved one element
            var element_group = Math.floor( i / ( array.length - 1 ) * ( max_elements - 1 ) );

            if( last_saved_element < element_group ) {
                new_array.push( array[i] );
                last_saved_element = element_group;
            }
        }
        return new_array;
    } else {
        return array;
    }
}

myArray = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19];

console.log( setMaxElements( myArray, 13 ) );  // [0, 2, 4, 5, 7, 8, 10, 12, 13, 15, 16, 18, 19]
console.log( setMaxElements( myArray, 10 ) );  // [0, 3, 5, 7, 9, 11, 13, 15, 17, 19]
console.log( setMaxElements( myArray, 07 ) );  // [0, 4, 7, 10, 13, 16, 19]
console.log( setMaxElements( myArray, 03 ) );  // [0, 10, 19]

对于我的用例,我决定保留第一个和最后一个元素并从其余元素中删除。如果这不是您的约束,那么您也可以使用此功能:

//  always saves first element but may remove the last element
function setMaxElements( array, max_elements ) {
    if( array.length > max_elements ) { 
        var new_array = [];
        var last_saved_element = -1 ;
        for( var i = 0; i < array.length; i++ ) {
            var element_group = Math.floor( i / array.length * max_elements );
            if( last_saved_element < element_group ) {
                new_array.push( array[i] );
                last_saved_element = element_group;
            }
        }
        return new_array;
    } else {
        return array;
    }
}

myArray = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19];

console.log( setMaxElements( myArray, 13 ) );       // [0, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19]
console.log( setMaxElements( myArray, 10 ) );       // [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
console.log( setMaxElements( myArray, 07 ) );       // [0, 3, 6, 9, 12, 15, 18]
console.log( setMaxElements( myArray, 03 ) );       // [0, 7, 14]

我将值放在excel中以了解如何创建公式。

Understanding the formula

最终结果

Final result

如您所见,该函数将任意长度的数组转换为所需的长度。