将数组中的特定值对象移动到结尾

时间:2017-02-27 06:23:17

标签: javascript jquery arrays sorting underscore.js

我试图找到一种方法将对象移动到数组的末尾

我有这个对象数组:

[
  {"id":"4","name":"Boaz"},
  {"id":"2","name":"Shareen"},
  {"id":"3","name":"Simon"},
  {"id":"1","name":"Miriam"}
]

我想移动整套 {" id":" 3"," name":" Simon"} 到最后。我有这个here的解决方案。但我的问题是,每当特定对象没有进入第二位置时,有没有办法检查id=3的对象并将其转换为使用underscoreJS结束

7 个答案:

答案 0 :(得分:5)

你可以只对数组进行排序。

解释

Array.sort需要3个可能的值作为返回值。

  • 1:表示a大于ba将移至比b更高的索引
  • 0:表示a等于b,且不会进行任何更改。
  • -1:表示a小于ba将移至低于b的索引。

有关详细信息,请参阅:How does Javascript's sort() work?



var data = [
  {"id":"4","name":"Boaz"},
  {"id":"2","name":"Shareen"},
  {"id":"3","name":"Simon"},
  {"id":"1","name":"Miriam"}
]

data.sort(function(a,b){
  return a.id == 3 ? 1 : 0
})

console.log(data)




另一种方法可以过滤掉具有必要id的对象,将它们从当前位置移除并将它们推回去,但这在我的理解中是太多的工作。排序是将对象向上或向下移动的理想方式。

答案 1 :(得分:1)

做一些简单的数组操作

var obj = [{
    "id": "4",
    "name": "Boaz"
  },
  {
    "id": "2",
    "name": "Shareen"
  },
  {
    "id": "3",
    "name": "Simon"
  },
  {
    "id": "1",
    "name": "Miriam"
  }
];
obj.forEach(function(v, i) {
  if (v.id == 3) {//test to see if the id is 3
    obj.push(obj[i]);//push the object to the last position
    obj.splice(i, 1);//remove the object from the current position

  }

});
console.log(obj);

答案 2 :(得分:1)

function findIdIndex(id, array) {
  return array.findIndex(elem=>elem.id===id);
}

这将为您提供具有给定ID的集合的位置,您之前的问题的答案涵盖了您想要做的其余部分。

答案 3 :(得分:1)

虽然没有"开箱即用"下划线函数,我们可以使用_.mixin()函数使用我们自己的函数扩展基础库。

扩展通过使用下划线_.indexOf()函数来返回与谓词匹配的元素的索引。然后,我们使用本机JS splice函数删除返回索引处的1项(请注意,如果_.indexOf返回-1 <,则会使数组不受影响/ em>的)。根据文档splice,返回已删除的所有元素的数组。我们最后使用本机JS concat函数,它将两个(或更多)数组合并在一起,将返回的值从concat放到提供的数组的末尾(arr )。

UnderscoreJS延伸

(function(_) {
    "use strict";
    _.mixin({
        moveToEndWhere: moveToEndWhere
    });

    /**
     * @function moveToEndWhere
     * @desc Searches an array for the first item matching a predicate, and moves the matched element to the end of the array
     * @param {array} arr Array to be searched and altered
     * @param {function|object} predicate Function or object used to search for matching element
     * @returns {array} Updated array
     * @memberof _.mixin
     */
    function moveToEndWhere(arr, predicate){
        return arr.concat(
            arr.splice(
                _.indexOf(arr, predicate)
                , 1
            )
        );
    }
})(_);

<强>用法

var data = [
    {"id":"4","name":"Boaz"},
    {"id":"2","name":"Shareen"},
    {"id":"3","name":"Simon"},
    {"id":"1","name":"Miriam"}
];

data = _.moveToEndWhere(data, {"id":3});

答案 4 :(得分:1)

我建议使用比较的增量,不仅如果你有多个真正的比较,但你需要进行对称比较,如果b包含要在最后排序的项目,那么你得到了订单,你想要。

var array = [{ id: "4", name: "Boaz" }, { id: "2", name: "Shareen" }, { id: "3", name: "Simon" }, { id: "1", name: "Miriam" }];

array.sort(function (a, b) {
    return (a.id === '3') - (b.id === '3');
});

console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 5 :(得分:0)

首先编写一个这样的方法,将值发送为&#39; 3&#39;并获取索引attrid

function getElementIndex(array, attr, value) {
    for(var i = 0; i < array.length; i += 1) {
        if(array[i][attr] === value) {
            return i;
        }
    }
    return -1;
}

通过此方法,您可以使用任何属性来获取数据。

然后写

var index=getElementIndex(array,'id','3');//here array is your data array you have 
var itemToReplace = array.splice(index, 1); 

array = array.concat(itemToReplace);

答案 6 :(得分:0)

您可以尝试使用相应对象的获取索引,然后检查位置:

&#13;
&#13;
var array  = [{ "id": "4", "name": "Boaz" }, { "id": "2", "name": "Shareen" }, { "id": "3", "name": "Simon" }, { "id": "1", "name": "Miriam" }];

var index =  array.findIndex(x => x.id == 3);

if(index === 2) {
 var person =  array.splice(index, 1);
 array  = array.concat(person);
}

console.log(array)
&#13;
&#13;
&#13;