我的目的是创建一个从数组中删除元素的函数,以将其长度减少到所需的长度。
但条件是它应该以(几乎)相等的间隔移除元素。该函数应该适用于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个图像。现在重要的部分是以相等的间隔移除帧,以便最终的动画尽可能少的生涩。阵列的长度每次都可以变化。
答案 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;
答案 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中以了解如何创建公式。
最终结果
如您所见,该函数将任意长度的数组转换为所需的长度。