Kamila Rywelska
Kamila Rywelska

Reputation: 25

Moving several elements within array to a certain index in array

I have an array of elements.

0,1,2,3,4,5,6,7,8,9

user can pick any number of elements and ask to move them after any 1 particular element.

example: ask for 4,5,7 to be moved after 1 for example, thus resulting in

0,1,4,5,7,2,3,6,8,9

or ask for 0,5 to be moved after 9

1,2,3,4,6,7,8,9,0,5

any pseudo code is greatly appreciated.

                move_after= function(after, move_array) {
                    //remove elements from the array
                    move_array.forEach(function(element) {
                        var index = operations.indexOf(element);
                        operations.splice(index, 1);
                    });


                    var after_index = operations.indexOf(after) + 1;

                    //insert each move_array element to array
                    move_array.forEach(function(element) {
                         operations.splice(after_index++, 0, element);
                    });
                }

                move_after(2, [0,1]);

doesn't exactly give me what i want

Upvotes: 2

Views: 115

Answers (5)

user3589620
user3589620

Reputation:

Here a prototype is used, which inserts an array into an array after a specific digit:

Array.prototype.insertIntoArr = function(insert, digit) {
    var i = this.indexOf(digit) + 1;
    return this.slice(0, i).concat(insert).concat(this.slice(i));
}

The function moveAfter( ... ) first cleans the array from the values of toMove. Second toMove is inserted after the specific digit:

function moveAfter(arr, toMove, after) {
    toMove.forEach(function (value) {
        arr.splice(arr.indexOf(value), 1);
    });
    var res = arr.insertIntoArr(toMove, after);
    return res;
}

Example

Upvotes: 1

Jose Collas
Jose Collas

Reputation: 1

Something like this?

var a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
var b = move_after(1, [4, 5, 7]);
var c = move_after(9, [0, 5]);

console.log(a);
console.log(b);
console.log(c);

function move_after(moveAfter, toMove) {
    var arr = a.reduce(function (c, e, i) {
        if (toMove.indexOf(e) === -1) {
            c.push(e);
        }
        return c;
    }, []);
    var toMoveAfterIndex = arr.indexOf(moveAfter) + 1;
    Array.prototype.splice.apply(
        arr, [toMoveAfterIndex, 0].concat(toMove)
    );
    return arr;
}

Upvotes: 0

pid
pid

Reputation: 11607

Try this:

move_after = function (after, move_array) {
  var i, s;

  s = [];
  for (i = 0; i < 10; i++)
  {
    // only append "i" it if is NOT in move_array
    if (move_array.indexOf(i) === -1) s.push(i);
    if (i == after) s.push(move_array);
  }

  return s;
};

Upvotes: 0

Daniel Rosano
Daniel Rosano

Reputation: 695

Using your idea

function move_after(orig_array, after, move_array) {
                //remove elements from the array
                move_array.forEach(function(element) {
                    var index = operations.indexOf(element);
                    orig_array.splice(index, 1);
                });

                var after_index = orig_array.indexOf(after) + 1;

                //insert each move_array element to array
                move_array.forEach(function(element) {
                     orig_array.splice(after_index++, 0, element);
                });
          return orig_array;
}

Then you use

var result = move_after([0, 1, 2] , 2, [0,1]);

Hope it works,

Dan

Upvotes: 0

Kevin F
Kevin F

Reputation: 2885

What about something like this: http://plnkr.co/edit/k2h6BWTUCFj5BS4oFF8C

(function(){
  var arr = [0,1,2,3,4,5,6,7,8,9];
  var userArr = [4,5,7];
  var temp = [];
  var pos = 1;

  for(var i = arr.length; i >= 0; i--){
    if(userArr.indexOf(arr[i]) !== -1){
      temp.push(arr[i]);
      arr.splice(i, 1);
    }
  }

  for(var i = 0; i < temp.length; i++){
    arr.splice(arr.indexOf(pos) + 1, 0, temp[i]);
  }

  console.log(arr);
  //outputs [0, 1, 4, 5, 7, 2, 3, 6, 8, 9]
})();

Upvotes: 0

Related Questions