【问题标题】: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 的条目移动到第一个位置,您不需要按任何标准对数组中的其他条目进行排序。

标签: javascript arrays json sorting object


【解决方案1】:

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

如果你不介意混合一下,你可以避免使用 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;});
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-15
  • 2023-03-29
  • 2011-03-31
  • 1970-01-01
  • 2017-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多