如何从多个连续数组中获取项目

How to get item from multiple consecutive arrays

我有点难以想出解决问题的方法。

我正在尝试获取数组集合索引处的项目。我实际上无法连接数组,它们需要分开。

通常,要从数组中获取第 3 项,您会这样做:

function getItemFromJustOneArray(index){
  var my_array = [1,2,3,4,5,6];
  return my_array[index];
}

getItemFromJustOneArray(2); // returns 3

但是,我有一堆数组(可以是任意数量的数组),这些数组无法合并为一个。

function getItemFromMultipleArrays(index){

  var array1 = [1,2];
  var array2 = [3,4,5];
  var array3 = [6];

  // I cannot use concat (or similar) to merge the arrays,
  // they need to stay seperate
  // also, could be 3 arrays, but could also be 1, or 5...

  // return 3;

}

getItemFromMultipleArrays(2); // SHOULD RETURN 3

我已经尝试了一堆遍历数组的行,但我无法真正找到有效的解决方案。

有人知道这个问题的优雅解决方案吗?

将所有数组嵌套在另一个数组中。然后遍历该数组,按每个数组的长度递减索引,直到它在当前元素的长度内。然后您可以 return 该嵌套数组的适当元素。

function getItemFromMultipleArrays(index) {

  var array1 = [1, 2];
  var array2 = [3, 4, 5];
  var array3 = [6];
  var all_arrays = [array1, array2, array3];
  var i;
  for (i = 0; i < all_arrays.length && index >= all_arrays[i].length; i++) {
    index -= all_arrays[i].length;
  }
  if (i < all_arrays.length) {
    return all_arrays[i][index];
  }
}

console.log(getItemFromMultipleArrays(2)); // SHOULD RETURN 3

为什么不将数组扩展到一个新数组并使用索引作为值?

function getItemFromMultipleArrays(index) {
    const
        array1 = [1, 2],
        array2 = [3, 4, 5],
        array3 = [6];

    return [...array1, ...array2, ...array3][index];
}

console.log(getItemFromMultipleArrays(2)); // 3

另一种使用偏移量迭代数组的方法。

function getItemFromMultipleArrays(index) {
    const
        array1 = [1, 2],
        array2 = [3, 4, 5],
        array3 = [6],
        temp = [array1, array2, array3];

    let j = 0;

    while (index >= temp[j].length) index -= temp[j++].length;

    return temp[j][index];
}

console.log(getItemFromMultipleArrays(2)); // 3
console.log(getItemFromMultipleArrays(5)); // 6

应该这样做,只需将所有数组复制到一个“大”数组中并访问它(添加了一个帮助函数)

// this function takes any amount of arrays and returns a new
// "concatted" array without affecting the original ones.
function connectArrays(...arrays) {
  return [...arrays.flat()];
}

function getItemFromMultipleArrays(index) {
  var array1 = [1,2];
  var array2 = [3,4,5];
  var array3 = [6];
  var allArrays = connectArrays(array1, array2, array3);
  
  return allArrays[index];
}

getItemFromMultipleArrays(2); // SHOULD RETURN 3