代码之家  ›  专栏  ›  技术社区  ›  Mr world wide

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

  •  22
  • Mr world wide  · 技术社区  · 7 年前

    我有一个这样的物体:

    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.
    }
    
    3 回复  |  直到 7 年前
        1
  •  35
  •   Mamun    7 年前

    由于您只是将一个项目移到顶部,因此我将使用 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);
        2
  •  7
  •   Mihai Alexandru-Ionut    7 年前

    您可以使用 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);
        3
  •  7
  •   WSD    3 年前

    这里有一种不同的非突变方法。我使用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];
    }
    

    如果你不介意混合一些东西,你可以避免 传播 操作员和使用 取消移动 相反我特别不喜欢将改变阵列的函数与不改变阵列的函数混合使用,但在某些情况下,您可能会得到一些性能改进。例如,对于一个很长的数组,原始方法中的以下更改将在保持易读性的同时稍微加快速度。

    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.The 类型可以如下所示:

    export interface Person {
    id: string;
    name: string;
    age: number;
    }
    

    和平