重复数组在一定范围内上下移动

repeat array going up and down in with some limit

我有这种形式的数据[1,2,3,4]。我想对这个数组执行一些操作,以便得到这样的输出 [1,2,3,4, 4,3,2,1, 1,2]。拜托,你能给我一些实现这个输出的方法吗?

// function declaration 

function arrayExm(array,limit){ 
  // want some operations here so that i will get this output
}

//function execution 

arrayExm([1,2,3,4],10) 
//so it will return [1,2,3,4, 4,3,2,1, 1,2]

您可以使用简单的 for 循环来实现它。

function arrayExm(array, limit) {
  var res = [],
    len = array.length;

  // iterate upto the limit
  for (var i = 0; i < limit; i++) {
    // define the value based on the iteration 
    res[i] = Math.floor(i / len) % 2 == 0 ? // check the array element repetition is odd or even
      array[i % len] : // if even define element in same order   
      array[len - i % len - 1]; // if odd define element in reverse order
  }

  return res;
};



console.log(arrayExm([1, 2, 3, 4], 10))

试试这个,它会对你有所帮助,在这段代码中,你可以通过给定真(向前)和假(向后)来开始向前和向后方向的数组排列。即使数组包含字符串,您也可以使用此代码进行排列。

var array = [1, 2, 3, 4];
var outputArray = [];
var j = 0;
var i;
arrayRepeat(array, 10, true);


alert(outputArray);

function arrayRepeat(array, limit, direction) {

  if (direction) {
    for (i = 0; i < array.length, j < limit; i++, j++) {
      outputArray[j] = array[i];
      if (i == array.length) {
        arrayRepeat(array, limit, false);
      }
    }
  } else {
    for (i = array.length - 1; i >= 0, j < limit; i--, j++) {
      outputArray[j] = array[i];
      if (i == -1) {
        arrayRepeat(array, limit, true);
      }
    }
  }
}

你也可以 concat() 你的数组和它的 reverse() 只要你限制参数使你能够整个数组,最后你将 slice() 数组的一部分,它将保留

var arrayReapet = (array, limit) => {
  var results = [];
  var divisor = parseInt(limit / array.length);
  var modulo = limit % array.length;
  for (var i = 0; i < divisor; i++) {
    if (i === 0) results = results.concat(array);
    else results = results.concat(array.reverse());
  }
  results = results.concat(array.reverse().slice(0, modulo));
  return results
}

console.log(arrayReapet([1, 2, 3, 4], 10));

编写一个生成器来生成来回序列。然后编写另一个生成器来获取前 n 个值。

function* repeat(arr) {
  const rev = arr.slice().reverse();

  while (true) {
    for (let x of arr) yield x;  // Up...
    for (let x of rev) yield x;  // and down...
  }
}

function* take(iterable, n) {
  for (let x of iterable) if (!n--) return; else yield x;
}

console.log([...take(repeat([1,2,3,4]), 10)]);