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

新手上路,请多包涵

我有一个这样的对象:

 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 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" },
]

我试过这个:

 $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.
}

原文由 Mr world wide 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 470
2 个回答

由于您只是将一个项目移到顶部,我将只使用 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);

原文由 Mamun 发布,翻译遵循 CC BY-SA 4.0 许可协议

这是一种不同的非变异方法。我仅将 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];
}

如果你不介意混合一些东西,你可以避免使用 扩展 运算符并使用 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;
}

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

附言。 Person 类型可以是这样的:

 export interface Person {
id: string;
name: string;
age: number;
}

和平!

原文由 guzmanoj 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题