如果index超出了数组的范围,请将index设置为最近的边界

时间:2015-08-14 21:59:11

标签: javascript arrays algorithm math

我们假设我们有一个长度为1到??

的数组

我们有一种方法可以通过单击向上或向下导航的按钮向上或向下导航此数组,该按钮显示在DOM中(想想分页)。

我们希望导航在我们超出下限时停止,或者当我们的导航超出上限时停止。

当我们达到下限时,我们会通过值 -1

来了解这一点

当我们到达上限时,我们会通过值(> array.length - 1)知道这一点。

我们的函数接受参数索引,如图所示

function goToChapter( index ){
  // compute value of index to within bounds.
  return array[ index ];
}

让我们说我们要做的就是使用计算的内部边界索引从返回的数组中获取一个值。

  

实施例

var array ["chapZero", "chapOne", "chapTwo", "chapThree"];

goToChapter( 2 );
=> "chapTwo;

goToChapter( 4 );
=> "chapThree"; // because four is out of upper bound so index became three.

goToChapter( -1 );
=> "chapZero"; // because -1 is our of lower bound so index became zero.

我意识到这可以用一些if语句完成,我正在寻找一种方法来使用某种数学公式,或许

  1. 将任何负数转换为0;
  2. 单独留下任何正数;
  3. 使用数组的长度来确定何时返回上限。
  4. 更新

    我和Andand的答案一起去了。我已经添加了足够的内容,可以将解决方案粘贴到控制台中,如果您觉得这有用,并希望对其进行测试。

    var array = [0,1,2,3,4];
    
    function goToChapter( index, array ){
      return array[(Math.min( array.length - 1, Math.max( 0, index )))];
    }
    
    goToChapter( -1, array ); => 0;
    
    goToChapter( 3, array ); => 3;
    
    goToChapter( 8, array ); => 4;
    

    谢谢Andand。

    注意:

    我也觉得这很有帮助,但速度不快。

    function setWithinArrayBounds( index, array ){
      return !!index ? 0 : index > ( array.length - 1 ) ? ( array.length - 1 ) : index;
    }
    

1 个答案:

答案 0 :(得分:5)

这称为钳位值以将其限制在指定范围内。

您可以使用min()max(),例如:

function goToChapter(array, index ){
    myIndex = Math.min(array.length-1, Math.max(0, index));
    return array[ myIndex ];
}

另一种方法是使用嵌套的三元运算符,例如

function goToChapter(array, index ){
    myIndex = index < 0 
        ? 0
        : index >= array.length
            ? array.length - 1
            : index;
    return array[ myIndex ];
}

您还可以使用

中的if语句
function goToChapter(array, index ){
    if (index < 0) {
        myIndex = 0;
    } else if (index >= array.length) {
        myIndex = array.length-1;
    } else {
        myIndex = index;
    }

    return array[ myIndex ];
}

或者使用顺序if语句的变体可能是

function goToChapter(array, index ){
    myIndex = index;

    if (myIndex < 0) {
        myIndex = 0;
    }

    if (myIndex >= array.length) {
        myIndex = array.length-1;
    }

    return array[ myIndex ];
}