怎么把一个数组中任意一项通过需求放到首位!

苏c大调
  • 70
let aArr = [
    {
      id: 1,
      age: 30
    },
    {
      id: 2,
      age: 32
    },
    {
      id: 3,
      age: 34
    },
    {
      id: 4,
      age: 36
    },
    {
      id: 5,
      age: 38
    },
    ]

怎么通过提供相应的id 来把数组aArr中相应的项排到第一位:
比如 给个id:4,得到数组:

let aArr = [
    {
      id: 4,
      age: 36
    },
    {
      id: 1,
      age: 30
    },
    {
      id: 2,
      age: 32
    },
    {
      id: 3,
      age: 34
    },
    {
      id: 5,
      age: 38
    },
    ]
回复
阅读 12.9k
11 个回答
//写的超烂,感觉会有更好的办法吧
var target_id = 4;
var tem,index;
for (var i = 0, len = aArr.length; i < len; i++) {
    if (aArr[i]['id'] == target_id) {
        tem = aArr[i];
        index=i;
    }
}
aArr.splice(index, 1)
aArr.unshift(tem)
console.log(aArr)
  1. 找到想要的id的元素下标

  2. 如果是第一个就不用动什么了 如果不是跟第一个元素交换

aArr.sort((a,b) => a.id===4 ? -1 : 0)
cd150505
  • 1.1k

update:

function todo(arr, id){
   var index = 1, newArr = [], length = arr.length;
   for (  var i=0; i<length; i++){
       if ( arr[i].id == id ){
           newArr[0] = arr[i];
       }
       else{
           newArr[index++] = arr[i];
       }
   }
    return  newArr;
}

doto(aArr,4)

1: for() 遍历找到 aArr[i].id == 4 , 返回 下标 i; temp=aArr[i];
2: aArr.splice(i,1)
3: aArr.unshift(temp)

hiYoHoo
  • 2.2k

封装了一个方法,可以将元素全部是对象的数组根据属性值将对应元素放到首位。

function setArrFirst(arr, property, value) {
    var chooseIndex;    //选中元素在数组中的索引
    var areBothObj = arr.every(function(item, index, array) {    //判断数组中的元素是否都为对象,都是对象则返回true
        return item instanceof Object;
    });
    if (areBothObj) {
        arr.forEach(function(item, index, array) {    //遍历数组,找到符合条件的元素索引
            if (item[property] == value) {
                chooseIndex =  index;
            }
        });
    } else {
        return false;
    }
    var choosed = arr.splice(chooseIndex, 1);    //将选中元素从原数组中剔除
    var newArr = choosed.concat(arr);    //合并选中元素和剔除了选中元素的原数组
    return newArr;
}
setArrFirst(aArr, 'id', 4);

PHP纯手打

$id = 4;
foreach($arr as $key => $value){
       if($arr[$key]['id'] == 4){
            $arrs = $arr[0];
            $arr[0] = $arr[$key];
            $arr[$key] = $arrs;
       }
}

不知楼主可看的明白?

为什么要调整数组顺序呢, 需求本身是不是有问题

试试这个方法

var changePos = function (id) {
    var index;
    aArr.map(function (v, i) {
        if (v.id == id) {
            index = i;
            return;
        }
    })
    aArr.splice(0, 0, aArr[index])
    aArr.splice(index + 1, 1);
}
funny_pp
  • 97
    function changePosition(id,array) {
        var i, len = array.length;
        if( len == 0 ) { return false; }
        if( array[0]['id'] == id ) { return array; }
        for( i = 1; i < len; i = i + 1 ) {
            if( array[i]['id'] == id ) {
                array.unshift(array[i]);
                array.splice(i+1,1);
                break;
            }
        }
        return array;
    }
sccfox
  • 1
新手上路,请多包涵

会比直接找到对应的元素然后放在首位慢点,因为遍历了整个数组。
好处是如果符合条件的有多个(比如 age === n 的放前面),都可以放到前面去。

const first = 4;
const s = arr.reduce((acc, item) => {
  if (item.id === first) {
    acc.unshift(item);
  } else {
    acc.push(item);
  }
  return acc;
}, []);

const targetIndex = array.findIndex(v => v.id === targetID);
[array[targetIndex], array[0]] = [array[0], array[targetIndex]];

宣传栏