将对象中的项目移动到最后位置

时间:2014-07-23 11:33:43

标签: javascript arrays sorting

我有一个对象数组。我想将选定的对象移动到数组中的最后一个位置。我如何在javascript或jquery中执行此操作?

以下是我的一些代码:

var sortedProductRow = this.product_row;

for (var s in sortedProductRow) {
    if (sortedProductRow[s]["parent_product_type"] != "")
        // Move this object to last position in the array
}

我正在循环使用for循环,我想要对输出进行排序,以便所有没有“parent_product_type”值的对象首先出现,然后出现值。

6 个答案:

答案 0 :(得分:31)

将元素(您知道其索引)移动到数组的末尾,执行以下操作:

array.push(array.splice(index, 1)[0]);

如果您没有索引,只有元素,那么请执行以下操作:

array.push(array.splice(array.indexOf(element), 1)[0]);

示例:

    var arr = [1, 2, 6, 3, 4, 5];
    arr.push(arr.splice(arr.indexOf(6), 1)[0]);
    console.log(arr); // [1, 2, 3, 4, 5, 6]

  

注意:

     

这仅适用于Arrays(使用[ ... ]语法创建或   Array())不使用对象(使用{ ... }语法创建或   Object()

答案 1 :(得分:3)

将数组第一个元素移动到同一个数组的结尾



    var a = [5,1,2,3,4];
    a.push(a.shift());
    console.log(a); // [1,2,3,4,5]




或者这样



    var a = [5,1,2,3,4];
    var b = a.shift();
    a[a.length] = b;
    console.log(a); // [1,2,3,4,5]




将数组任何元素移动到同一数组中的任何位置



    // move element '5' (index = 2) to the end (index = 4)
    var a = [1, 2, 5, 4, 3];
    a.splice(4,0,a.splice(2,1)[0]);
    console.log(a); // [1, 2, 4, 3, 5]




或者它也可以转换为原型,像x表示元素的当前位置,而y表示数组中的新位置



var a = [1, 2, 5, 4, 3];
Array.prototype.move = function(x, y){
      this.splice(y, 0, this.splice(x, 1)[0]);
      return this;
    };
    
    a.move(2,4);
    console.log(a); // ["1", "2", "4", "3", "5"]




答案 2 :(得分:1)

将任何元素移动到最后位置-对于 lodash 用户:

    const array = ['A', 'B', 'C', 'D'] // output: A, B, C, D

// finds index of value 'B' and removes it
    _.pull(array , 'B') // output: A, C, D

// adds value of 'B' to last position
    _.concat(array , 'B') // output: A, C, D, B

答案 3 :(得分:1)

这更干净,无需使用[0]的数组索引

const colors = ['white', 'black', 'red', 'blue', 'green'];

// will push the blue to the end of the array
colors.push(colors.splice(colors.indexOf('blue'), 1).pop());

console.debug(colors);
// ["white", "black", "red", "green", "blue"]

答案 4 :(得分:0)

使用匿名函数,您可以传入数组和要作为过滤依据的值。

let concatToEnd = function (arr, val) {
        return arr.filter(function(x) {
            return x !== val; // filter items not equal to value
        }).concat(arr.filter(function(x) { // concatonate to filtered array
            return x === val; // filter items equal to value 
        })
    );
}

// invoke
concatToEnd(array, 'parent_product_type');

您可以进一步缩短此时间:

let concatToEnd = (arr,val) => arr.filter(x => x !== val).concat(arr.filter(x => x === val))

此函数过滤不等于传入值的项目,然后将另一个 {{1} }函数可过滤出等于您传入的值的项目。

此函数实际上将数组分为2个过滤的部分,然后将它们重新连接在一起

尚未针对您的用例进行过测试,但是我使用了类似的方法将数组的所有数字移到索引的末尾。

答案 5 :(得分:0)

您可以通过 splicing 移动任意数量的项目,然后将它们 spreading 移动到 push

const numberOfItems = 3;
let items = [1,2,3,4,5,6,7,8,9];
items.push(...items.splice(0, itemsToMove))