3

I want to access contents of an array by arbitrary indexes. Lets say we have an array with three elements in it. The modulo comes in handy here and solves the problem for any positive integer perfectly:

var arr = array['foo', 'bar', 'foobar'];
var someInteger = 3;
var element = array[ someInteger%arr.length ]; // returns the first element 'foo'

Now I would like to have the same result for negative integers but I do not know how =(

var arr = array['foo', 'bar', 'foobar'];
var someInteger = -1; // I need this negative integer to return the last element which it doesn´t
var someInteger = -2; // I need this negative integer to return 'bar'
var someInteger = -3; // I need this negative integer to return 'foo'
var someInteger = -4; // I need this negative integer to return 'foobar'
var someInteger = -5; // I need this negative integer to return 'bar'

I really hope my problem is clear enough =)

lilly
  • 297
  • 1
  • 2
  • 6

2 Answers2

7

You can use

  1. n integer
  2. n % l integer in (-l, l)
  3. n % l + l integer in (0, 2*l)
  4. (n % l + l) % l integer in [0, l)

In JavaScript,

arr[(someInteger % arr.length + arr.length) % arr.length]

Alternatively, you can play with flooring, ceiling and truncating:

n - Math.floor(n / l) * l; // in [ 0,l)
n - Math.ceil (n / l) * l; // in (-l,0]
n - Math.trunc(n / l) * l; // in (-l,l)
Oriol
  • 274,082
  • 63
  • 437
  • 513
  • 1
    This was really very very helpful! Thank you a lot, smart boy! I wish i had asked my question hours ago... – lilly May 30 '15 at 17:26
  • 1
    @lilly Not at all :) If you have lots of indices consider implementing that in a function to avoid repeating it each time. – Oriol May 30 '15 at 17:30
-2

If the number is negative:

while(someInteger < 0)
    someInteger += arr.length;

and then use array[ someInteger%arr.length ] as you did earlier.

Racing
  • 66
  • 1
  • 11