将元素移到数组中的第一个位置

Mr *_*ide 2 javascript arrays sorting json object

我有一个这样的对象:

var data = [
    { id: "fmgbwe45", age: 24, gender: "male"   },
    { id: "kjregh23", age: 27, gender: "female" }, 
    { id: "kjfdhg87", age: 30, gender: "male" }, 
    { id: "lsdjfk43", age: 10, gender: "female" }, 
]
Run Code Online (Sandbox Code Playgroud)

我想对对象进行排序,这是我的预期输出:

var data = [
    { id: "kjfdhg87", age: 30, gender: "male" },  //only one record will match in my sort
    { id: "fmgbwe45", age: 24, gender: "male"   },
    { id: "kjregh23", age: 27, gender: "female" }, 
    { id: "lsdjfk43", age: 10, gender: "female" }, 
]
Run Code Online (Sandbox Code Playgroud)

我已经试过了:

$scope.sort_by = function (newSortingOrder) {
    var stringToFilter = newSortingOrder.toString();   //this holds 'kjfdhg87'
    var obj = data.sort(function(o) { return o.id - stringToFilter; });
    var finalObj = [obj];
    sortedData = finalObj;
    console.log(sortedData ); //sorting is not working as expected where im doing wrong.
}
Run Code Online (Sandbox Code Playgroud)

Mam*_*mun 9

由于您只是将一项移至顶部,因此我将仅使用splice()unshift()该项:

var data = [
    { id: "fmgbwe45", age: 24, gender: "male"   },
    { id: "kjregh23", age: 27, gender: "female" }, 
    { id: "kjfdhg87", age: 30, gender: "male" }, 
    { id: "lsdjfk43", age: 10, gender: "female" }, 
]
data.forEach(function(item,i){
  if(item.id === "kjfdhg87"){
    data.splice(i, 1);
    data.unshift(item);
  }
});

console.log(data);
Run Code Online (Sandbox Code Playgroud)


Mih*_*nut 6

您可以使用unshift方法。

var data = [
    { id: "fmgbwe45", age: 24, gender: "male"   },
    { id: "kjregh23", age: 27, gender: "female" }, 
    { id: "kjfdhg87", age: 30, gender: "male" }, 
    { id: "lsdjfk43", age: 10, gender: "female" }, 
]

var stringToFilter = 'kjfdhg87';   //this holds 'kjfdhg87'
data.unshift(data.splice(data.findIndex(item => item.id === stringToFilter), 1)[0])
console.log(data);
Run Code Online (Sandbox Code Playgroud)

  • @Mrworldwide,您可以尝试更简单的解决方案:`data.sort((a, b)=>{ if(b.id == stringToFilter) return 1;});` (2认同)

Jos*_*man 6

这是一种不同的非变异方法。我仅将 TypeScript 用于 Person 定义,但除此之外只是 ES6。

基本上我们只需要:

  1. 从原始数组中过滤出人物
  2. 在开头再次插入
movePersonInArray(person: Person, arrayOfPersons: Person[]): Person[] {
    // remove the item from the array
    const filteredArrayOfPersons = arrayOfPersons.filter((p: Person) => p.id !== person.id);
    // add it at the beginning
    return [{ ...person }, ...filteredArrayOfPersons];
}
Run Code Online (Sandbox Code Playgroud)

如果您不介意稍微混合一下,您可以避免使用扩展运算符并使用unshift代替。我特别不喜欢将改变数组的函数与不改变数组的函数混合使用,但在某些情况下,您可能会获得一些性能改进。例如,对于一个很长的数组,原始方法中的以下更改将在保持易读性的同时加快速度。

movePersonInArray(person: Person, arrayOfPersons: Person[]): Person[] {
    // remove the item from the array
    const filteredArrayOfPersons = arrayOfPersons.filter((p: Person) => p.id !== person.id);
    // add it at the beginning
    filteredArrayOfPersons.unshift({...person});
    return filteredArrayOfPersons;
}
Run Code Online (Sandbox Code Playgroud)

这两种方法都不会改变arrayOfPersons数组,而是返回带有更改的副本。在这里您可以了解有关数组变异方法的更多信息 https://doesitmutate.xyz/

附注。该类型可以是这样的:

export interface Person {
id: string;
name: string;
age: number;
}
Run Code Online (Sandbox Code Playgroud)

和平!