Marvin3
Marvin3

Reputation: 6041

Loop through looped sequence of numbers

There is an array of numbers [1,2,3,4,5,6,7,8,9,10]

I need to get all numbers from this sequence that are different from current for more than 2 items, but looped.

For example if current number is one, so new list should have everything except 9,10,1,2,3, or if current number is four so new list should be everything except 2,3,4,5,6.

Is there any technique how to make this, without creating multiple loops for items at start and at the end?

Thank you.

Upvotes: 3

Views: 3124

Answers (3)

Otto Allmendinger
Otto Allmendinger

Reputation: 28268

var a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];          

var exclude = function (start, distance, array) { 
    var result = [];                              

    for (var i = 0; i < array.length; i++) {      

        var d = Math.min(                         
            Math.abs(start - i - 1),              
            Math.abs(array.length + start - i - 1)
        )                                         

        if (d > distance) {                      
            result.push(array[i]);                
        }                                         
    }                                             

    return result;                                
}                                                 

Upvotes: 2

okuznetsov
okuznetsov

Reputation: 278

You may use javascript array.slice:

function get_offset_sequence(arr, index, offset) {
        var result = [];
        if (index - offset < 0) {
            result = arr.slice(index - offset).concat(arr.slice(0, index + offset + 1));
        }
        else if (index + offset > arr.length - 1) {
            result = arr.slice(index - offset).concat(arr.slice(0, Math.abs(arr.length - 1 - index - offset)));
        }
        else {
            result = arr.slice(index - offset, index + offset + 1)
        }
        return result;
    }

Example of use:

var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var index = 1;
var offset = 2;

for (var i=0; i < 10; i++) { console.log(i, arr[i], get_offset_sequence(arr, i, offset)) }

Upvotes: 1

Florent
Florent

Reputation: 12420

I think this performs what you asked:

// Sorry about the name
function strangePick(value, array) {
  var n = array.length
    , i = array.indexOf(value);

  if (i >= 0) {
    // Picked number
    var result = [value];

    // Previous 2 numbers
    result.unshift(array[(i + n - 1) % n]);
    result.unshift(array[(i + n - 2) % n]);

    // Next 2 numbers
    result.push(array[(i + 1) % n]);
    result.push(array[(i + 2) % n]);

    return result;
  } else {
    return [];
  }
}

Some tests:

var array = [1,2,3,4,5,6,7,8,9,10];

console.log(strangePick(1, array)); // [9,10,1,2,3]
console.log(strangePick(4, array)); // [2,3,4,5,6]

Upvotes: 1

Related Questions