从后面获取数组项

时间:2018-05-25 04:05:26

标签: javascript

我一直试图从Array的后面获取Items。该函数应该在循环中打印值。在下面的图像中,您可以看到模式中缺少两个项目。

enter image description here

预期结果

//24,25,26,27,28,29,30
//17,18,19,20,21,22,23
//10,11,12,13,14,15,16
//3,4,5,6,7,8,9
//1,2,26,27,28,29,30

5和9数组长度不是7.第5个数字数组应该有值。 [1,2,26,27,28,29,30][26,27,28,29,30,2,1]。 相同的模式应该应用于9数字阵列。

我已尝试过,但未找到解决方案。 Fiddle



	// Setup
var arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30];
var arrIndex = 30;
var values

function getValues(length) {
    arrIndex = arrIndex - length;
    
    if(arrIndex<0){
      arrIndex = arr.length - Math.abs(arrIndex)
      values = arr.slice(arrIndex, arrIndex+length)
    }
    else{
        values = arr.slice(arrIndex, arrIndex+length)
    }

    var valuesCount = values.length;

    return values;
}

// Get the values
for (var i = 0; i < 10; i++) {
    console.log( getValues(7) );
}
&#13;
&#13;
&#13;

如果我们从Array的开头获取项目,这里的代码工作正常。 Fiddle

2 个答案:

答案 0 :(得分:5)

@carlos,尝试以下解决方案,

问题是,这里有(Array.slice)函数。

你有30个数组[数组索引仅对0到29有效]。 即变量= [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23] ,24,25,26,27,28,29,30];

现在当你使用var arrIndex = 30时;根据循环,您的Array(5)的值从索引25开始,并且您的数组长度为7。

所以在这里,您可以尝试从25 + 7(即FYI,31是索引)获取值。

因此,你的值= arr.slice(25,31)。我们知道,我们的 var arr 中没有30和31索引,那么它肯定也没有数组5的值。

所以这里解决方案如果切片数组的endIndex不存在那么我们需要再次从O索引启动以获得剩余元素。所以你需要记录缺少多少索引? [这里它的count = 2]所以我们需要阻止那个计数并从(0,cnt)获得那个数组。最后我们需要将原始数组与我们的下一个数组相连(即我们从0开始)

要解决此问题,请编写以下逻辑

  if (arrIndex < 0) {
    arrIndex = arr.length - Math.abs(arrIndex)
    var otherVal = 0;
    if (arrIndex + length >= arr.length) {
      otherVal = (arrIndex + length) - arr.length;
      values = arr.slice(arrIndex, arr.length)
    }
    if (otherVal > 0) {
      values = values.concat(arr.slice(0, otherVal))
    }

所以你的最终输出将如下所示,

// Setup
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30];
var arrIndex = 30;
var values

function getValues(length) {
  arrIndex = arrIndex - length;
  if (arrIndex < 0) {
    arrIndex = arr.length - Math.abs(arrIndex)
    var otherVal = 0;
    if (arrIndex + length >= arr.length) {
      otherVal = (arrIndex + length) - arr.length;
      values = arr.slice(arrIndex, arr.length)
    }
    if (otherVal > 0) {
      values = values.concat(arr.slice(0, otherVal))
    }
  } else {
    values = arr.slice(arrIndex, arrIndex + length)
  }
  var valuesCount = values.length;
  return values;
}
// Get the values
for (var i = 0; i < 10; i++) {
  console.log(getValues(7));
}

答案 1 :(得分:2)

你有一个非常有趣的要求,但接受挑战:)

const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30];

function getValues(length) {
  const values = [];

  let temp = [];
  for (let i = arr.length - 1; i >= 0; i -= 1) {
    temp.unshift(arr[i]);

    if (temp.length === length) {
      values.push(temp);
      temp = [];
    }
  }

  if (temp.length > 0) {
    for (let i = arr.length - length + temp.length; i < arr.length; i += 1) {
      temp.push(arr[i]);
    }

    values.push(temp);
  }

  return values;
}

const values = getValues(7);

for (let i = 0; i < values.length; i += 1) {
  console.log(values[i]);
}

这里发生的事情是我向后循环数组并使用unshift通过将值放在数组的前面来创建临时数组。当我收集数组的length数量时,然后我将该数组推送到另一个数组中,创建一个数组数组,其中指定的length值传递给getValues函数。

在循环结束时,如果临时数组中有任何内容,则意味着它无法完成创建length大小的数组,其余项目位于循环的末尾。那么我们所做的就是到达数组的末尾以获取剩余的数量,并完成临时数组以获得长度为length的最终数组,并将其推送到最终的values数组数组中。