Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将元素移动到数组中的第一个位置_Javascript_Arrays_Json_Sorting_Object - Fatal编程技术网

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;})谢谢:)又漂亮又干净