将元素移动到数组中的第一个位置
Posted
技术标签:
【中文标题】将元素移动到数组中的第一个位置【英文标题】:Move element to first position in array 【发布时间】:2018-10-15 14:23:10 【问题描述】:我有一个这样的对象:
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.
【问题讨论】:
是否要按 id 字段排序? 是的,我想按 id 排序,只有 id。 将此称为“排序”是一种糟糕的描述方式。您想要做的就是将具有匹配id
的条目移动到第一个位置,您不需要按任何标准对数组中的其他条目进行排序。
【参考方案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
return [ ...person , ...filteredArrayOfPersons];
如果你不介意混合一下,你可以避免使用 spread 操作符,而使用 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/
PS。 Person 类型可以是这样的:
export interface Person
id: string;
name: string;
age: number;
和平!
【讨论】:
谢谢:) 干净整洁【参考方案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);
【讨论】:
它可能有效,但我不喜欢这种方法,因为它在循环遍历数组时操纵数组中的位置。【参考方案3】:你可以使用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);
【讨论】:
@Mrworldwide,不,item1 和 item2 是传递给排序函数的回调函数的元素。 @Mrworldwide,您是否要对数组进行排序但将newSortingOrder
保留在第一位?
@Mrworldwide,我更新了我的答案。请编辑您的问题。这不是排序。
感谢您的帮助,我真的很欣赏它的实际 ES5,所以我使用@mamun 回答。
@Mrworldwide,您可以尝试更简单的解决方案:data.sort((a, b)=> if(b.id == stringToFilter) return 1;);
以上是关于将元素移动到数组中的第一个位置的主要内容,如果未能解决你的问题,请参考以下文章
2021-05-28:跳跃游戏 II。给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可