Move an array element from one array position to another

后端 未结 30 2525
渐次进展
渐次进展 2020-11-22 08:36

I\'m having a hard time figuring out how to move an array element. For example, given the following:

var arr = [ \'a\', \'b\', \'c\', \'d\', \'e\'];
<         


        
相关标签:
30条回答
  • 2020-11-22 09:07

    I've implemented an immutable ECMAScript 6 solution based off of @Merc's answer over here:

    const moveItemInArrayFromIndexToIndex = (array, fromIndex, toIndex) => {
      if (fromIndex === toIndex) return array;
    
      const newArray = [...array];
    
      const target = newArray[fromIndex];
      const inc = toIndex < fromIndex ? -1 : 1;
    
      for (let i = fromIndex; i !== toIndex; i += inc) {
        newArray[i] = newArray[i + inc];
      }
    
      newArray[toIndex] = target;
    
      return newArray;
    };
    

    The variable names can be shortened, just used long ones so that the code can explain itself.

    0 讨论(0)
  • 2020-11-22 09:08

    Immutable version without array copy:

    const moveInArray = (arr, fromIndex, toIndex) => {
      if (toIndex === fromIndex || toIndex >= arr.length) return arr;
    
      const toMove = arr[fromIndex];
      const movedForward = fromIndex < toIndex;
    
      return arr.reduce((res, next, index) => {
        if (index === fromIndex) return res;
        if (index === toIndex) return res.concat(
          movedForward ? [next, toMove] : [toMove, next]
        );
    
        return res.concat(next);
      }, []);
    };
    
    0 讨论(0)
  • 2020-11-22 09:09

    Here is my one liner ES6 solution with an optional parameter on.

    if (typeof Array.prototype.move === "undefined") {
      Array.prototype.move = function(from, to, on = 1) {
        this.splice(to, 0, ...this.splice(from, on))
      }
    }
    

    Adaptation of the first solution proposed by digiguru

    The parameter on is the number of element starting from from you want to move.

    0 讨论(0)
  • 2020-11-22 09:09

    This is a really simple method using splice

    Array.prototype.moveToStart = function(index) {
        this.splice(0, 0, this.splice(index, 1)[0]);
        return this;
      };
    
    0 讨论(0)
  • 2020-11-22 09:10
        Array.prototype.moveUp = function (value, by) {
            var index = this.indexOf(value),
                newPos = index - (by || 1);
    
            if (index === -1)
                throw new Error("Element not found in array");
    
            if (newPos < 0)
                newPos = 0;
    
            this.splice(index, 1);
            this.splice(newPos, 0, value);
        };
    
        Array.prototype.moveDown = function (value, by) {
            var index = this.indexOf(value),
                newPos = index + (by || 1);
    
            if (index === -1)
                throw new Error("Element not found in array");
    
            if (newPos >= this.length)
                newPos = this.length;
    
            this.splice(index, 1);
            this.splice(newPos, 0, value);
        };
    
    
    
        var arr = ['banana', 'curyWurst', 'pc', 'remembaHaruMembaru'];
    
        alert('withiout changes= '+arr[0]+' ||| '+arr[1]+' ||| '+arr[2]+' ||| '+arr[3]);
        arr.moveDown(arr[2]);
    
    
        alert('third word moved down= '+arr[0] + ' ||| ' + arr[1] + ' ||| ' + arr[2] + ' ||| ' + arr[3]);
        arr.moveUp(arr[2]);
        alert('third word moved up= '+arr[0] + ' ||| ' + arr[1] + ' ||| ' + arr[2] + ' ||| ' + arr[3]);
    

    http://plnkr.co/edit/JaiAaO7FQcdPGPY6G337?p=preview

    0 讨论(0)
  • 2020-11-22 09:10

    It is stated in many places (adding custom functions into Array.prototype) playing with the Array prototype could be a bad idea, anyway I combined the best from various posts, I came with this, using modern Javascript:

        Object.defineProperty(Array.prototype, 'immutableMove', {
            enumerable: false,
            value: function (old_index, new_index) {
                var copy = Object.assign([], this)
                if (new_index >= copy.length) {
                    var k = new_index - copy.length;
                    while ((k--) + 1) { copy.push(undefined); }
                }
                copy.splice(new_index, 0, copy.splice(old_index, 1)[0]);
                return copy
            }
        });
    
        //how to use it
        myArray=[0, 1, 2, 3, 4];
        myArray=myArray.immutableMove(2, 4);
        console.log(myArray);
        //result: 0, 1, 3, 4, 2
    

    Hope can be useful to anyone

    0 讨论(0)
提交回复
热议问题