【问题标题】:Getting a stack of 5 elements from an array based on a single index基于单个索引从数组中获取 5 个元素的堆栈
【发布时间】:2020-05-12 11:59:18
【问题描述】:

我试图弄清楚如何根据单个索引从数组中提取 5 个数组元素。索引将是这 5 个数组元素中间的元素。例如,如果我有这个数组:

let array = ['1', '2', '3', '4', '5', '6', '7']

索引为 2,我想将此数组返回给我:

['1', '2', '3', '4', '5']

如果索引为 0,我想把这个数组返回给我:

['6', '7', '1', '2', '3']

如果索引是 5,我想把这个数组返回给我:

['4', '5', '6', '7', '1']

我希望我能够传达我想要做的事情。我希望与索引对应的元素位于数组的中间,并且还附加了 2 个前一个元素和 2 个下一个元素。

如您所见,当索引位于数组的末尾并且在索引之后没有要追加的元素时,我从头开始追加元素。反之亦然,当索引位于数组的开头时,我从数组的结尾添加元素。这是我想不通的部分。

【问题讨论】:

  • 您的指数值和预期回报对我来说没有多大意义。第一个例子不是索引0,第二个5,第三个3吗?

标签: javascript


【解决方案1】:

您可以添加索引处理。如果索引小于 0 = 将数组长度添加到索引,如果索引大于数组长度 - 从中​​减去数组长度。它会解决你的问题

let array = ['1', '2', '3', '4', '5', '6', '7']

function getArr(arr, idx) {
let newArr = []

     for(let i= idx -2; i <= idx +2; i++) {
       let currentindex = i
       if(i < 0) {
         currentindex = i + arr.length
       } else if( i >= arr.length) {
          currentindex = i - array.length
       }
       newArr.push(arr[currentindex])
     }
return newArr
}

console.log(getArr(array, 0))
console.log(getArr(array, 2))
console.log(getArr(array, 5))

【讨论】:

    【解决方案2】:

    这是一种声明式(函数式编程)方法:

    如果数组是a 并且给定的索引是i,我们可以想象想要的数组是:

    [i-2, i-1, i, i+1, 1+2]
    // Unfortunately Javascript doesn't support [start..end] syntax
    

    但是,如果我们尝试将其用作数组的索引 (a),除非我们可以循环访问列表项,否则某些索引可能不在列表中。例如,在 [1, 2, 3] 中,第 5 项将是 2(5 mod 3)。这样的函数应该已经被小search这样写好了:

    const arrayItem = (a, i) => a[(i % a.length + a.length) % a.length]
    

    下面是将输入数组转换为名为@9​​87654327@ 的函数的输出步骤,该函数接受输入数组 (a) 和索引 (i):

    const f = (a, i) => [i - 2, i - 1, i, i + 1, i + 2].map(x => arrayItem(a, x))
    

    或者不依赖就写进去:

    const array = ['1', '2', '3', '4', '5', '6', '7']
    
    const f = (a, i) => [i - 2, i - 1, i, i + 1, i + 2]
      .map(x => a[(x % a.length + a.length) % a.length])
    
    console.log(f(array, 2))
    console.log(f(array, 0))
    console.log(f(array, 5))

    【讨论】:

      【解决方案3】:

      一个解决方案是用重复的数组包装你的数组。然后您可以将数组的长度添加到索引并创建您的数组。这很好地处理了边缘情况。

      function getArr(arr, idx) {
        let ary = [...arr, ...arr, ...arr]
        let ptr = idx+arr.length;
        return ary.slice(ptr-2, ptr+3);
      }
      
      let array = ['1', '2', '3', '4', '5', '6', '7']
      console.log(getArr(array, 0))
      console.log(getArr(array, 2))
      console.log(getArr(array, 5))

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-24
        • 2015-08-31
        • 1970-01-01
        • 2011-02-16
        • 2018-11-21
        • 1970-01-01
        相关资源
        最近更新 更多