Javascript 将元素移动到数组中的第一个位置
我有一个这样的物体:Javascript 将元素移动到数组中的第一个位置,javascript,arrays,json,sorting,object,Javascript,Arrays,Json,Sorting,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" }, ] export interface P
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" },
]
export interface Person {
id: string;
name: string;
age: number;
}
我想对对象进行排序,这是我的
预期产出:
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.
}
您可以使用
unshift
方法
var数据=[
{id:“fmgbwe45”,年龄:24岁,性别:“男性”},
{id:“kjregh23”,年龄:27岁,性别:“女性”},
{id:“kjfdhg87”,年龄:30岁,性别:“男性”},
{id:“lsdjfk43”,年龄:10岁,性别:“女性”},
]
var stringToFilter='kjfdhg87'//这包含“kjfdhg87”
data.unshift(data.splice(data.findIndex(item=>item.id==stringToFilter),1)[0])
控制台日志(数据)代码>由于您只是将一个项目移动到顶部,我将只使用splice()
和unshift()
项目:
var数据=[
{id:“fmgbwe45”,年龄:24岁,性别:“男性”},
{id:“kjregh23”,年龄:27岁,性别:“女性”},
{id:“kjfdhg87”,年龄:30岁,性别:“男性”},
{id:“lsdjfk43”,年龄:10岁,性别:“女性”},
]
data.forEach(功能(第i项){
如果(项目id==“kjfdhg87”){
数据拼接(i,1);
数据。取消移位(项目);
}
});
控制台日志(数据)代码>这里有一种不同的非变异方法。我使用TypeScript只是为了定义Person,但除此之外,它只是ES6
基本上,我们只需要:
从原始数组中筛选出此人
在开头再插入一次
如果您不介意稍微混合一些内容,可以避免使用“排列”操作符,而是使用“取消移位”。我特别不喜欢将改变数组的函数与不改变数组的函数混合使用,但在某些情况下,您可能会获得一些性能改进。例如,对于一个很长的数组,在保持易读性的同时,原始方法中的以下更改将稍微加快速度
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数组,而是返回一个包含更改的副本。
在这里,您可以了解有关数组变异方法的更多信息
注:人员类型可以是这样的:
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" },
]
export interface Person {
id: string;
name: string;
age: number;
}
和平 您想按id字段排序吗?是的,我想按id排序,只需id。将此称为“排序”是一种糟糕的描述方式。您所要做的就是将具有匹配的id
的条目移动到第一个位置,您不会要求按任何条件对数组中的其他条目进行排序。@Mrworldwide、no、item1和item2是传递给排序函数回调函数的元素。@Mrworldwide,是否要对数组进行排序,但将newSortingOrder
保留为第一个?@Mrworldwide,我更新了答案。请编辑您的问题。这不是排序。谢谢你的帮助,我真的知道它实际上是ES5,所以我使用@mamun answer@Mrworldwide,你可以尝试一个更简单的解决方案:data.sort((a,b)=>{if(b.id==stringToFilter)return 1;})代码>谢谢:)又漂亮又干净