在JavaScript中过滤数组,而不使用任何内置函数或新数组

Filtering an array in JavaScript with out using any built in functions or a new array

本文关键字:数组 函数 内置 新数组 任何 过滤 JavaScript      更新时间:2023-09-26

我有一个最小值和最大值。遍历一个数组,我需要删除所有在min和max之间的元素。我不能使用任何内置的数组函数,如splice,数组需要保持在原来的顺序。例如,数组[1,5,13,27,58]min = 10 max = 30将返回一个数组[1,5,58]。我在寻找更多的策略如何在N时间复杂度下做到这一点。这个问题是为面试准备的。

这是我试过的代码,

function filter_range(array, min, max) {
  for (var i = 0; i < array.length; i++) {
    if (min < array[i] && array[i] < max) {
      for (var j = i; j < array.length - 1; j++) {
        var temp = array[j]
        array[j] = array[j + 1];
        array[j + 1] = temp;
      }
    }
  }
}
var array = [1, 5, 23, 13, 59];
filter_range(array, 10, 30);
for (var i = 0; i < array.length; i++) {
  console.log(array[i])
}

只需用适合该范围的下一个值覆盖数组中的第N个元素就可以实现这一点,其中N是到目前为止发现的值的数量。然后将数组的length设置为您找到的值的数量。

function filter_range(array, min, max) {
  var nextIndex = 0;
  for (var i = 0, len = array.length; i < len; i++) {
    var value = array[i];
    if (value >= min && value <= max) {
      array[nextIndex++] = value;
    }
  }
  array.length = nextIndex;
}
function test(arr, min, max) {
  console.log('Input: ' + arr.join(', '));
  console.log('Range: [' + min + ', ' + max + ']');
  filter_range(arr, min, max);
  console.log('Output: ' + arr.join(', '));
  console.log('');
}
test([1, 2, 3], 1, 2);
test([1, 2, 3], 2, 3);
test([1, 2, 3, 4, 5], 2, 4);
test([1, 2, 3], 0, 100);
test([1, 5, 13, 27, 58], 10, 30);
test([1, 13, 5, 58, 27], 10, 30);

我能想到的最简单的方法是将好的值移动到一个新的数组

  function run(){
  var a = [1,5,13,27,58];
  var b = [];
  var min = 10;
  var max = 30;
  alert (a);
  for (i=0;i<a.length;i++){
    if (a[i]>max || a[i]<min) {
      b.push(a[i]);
    }
  }
  alert (b);
}