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

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;);

以上是关于将元素移动到数组中的第一个位置的主要内容,如果未能解决你的问题,请参考以下文章

如何将所有内容移动到阵列中的一个位置? C#

数组元素保持堆叠在数组的第一个位置

移动数组中的元素

2021-05-28:跳跃游戏 II。给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可

LeetCode习题——在排序数组中查找元素的第一个和最后一个位置(二分查找)

1536. 在排序数组中查找元素的第一个和最后一个位置