У меня есть такой объект:
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.info(sortedData ); //sorting is not working as expected where im doing wrong.
}
да, я хочу сортировать по идентификатору, только по идентификатору.
Назвать это «сортировкой» - плохой способ описать это. Все, что вам нужно сделать, это переместить запись с совпадающим id в первую позицию, вы не просите отсортировать другие записи в массиве по каким-либо критериям.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете использовать метод 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.info(data);@Mrworldwide, no, item1 и item2 - это элементы, переданные в функцию обратного вызова для функции сортировки.
@Mrworldwide, вы хотите отсортировать массив, но оставить newSortingOrder первым?
@Mrworldwide, я обновил свой ответ. Пожалуйста, отредактируйте свой вопрос. Это не сортировка.
спасибо за помощь, я действительно ценю его ES5, поэтому я использую ответ @mamun.
@Mrworldwide, вы можете попробовать более простое решение: data.sort((a, b)=>{ if (b.id == stringToFilter) return 1;});
Прекрасный ответ, большое спасибо!
Поскольку вы просто перемещаете один элемент наверх, я просто буду использовать 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.info(data);Вот другой подход без мутации. Я использую TypeScript только для определения Person, но в остальном это просто ES6.
В основном нам просто нужно:
movePersonInArray(person: Person, arrayOfPersons: Person[]): Person[] {
// remove the item from the array
const filterArrayOfPersons = arrayOfPersons.filter((p: Person) => p.id !== person.id);
// add it at the beginning
return [{ ...person }, ...filterArrayOfPersons];
}
Если вы не против немного перемешать, вы можете избежать оператора распространение и использовать вместо него не сдвигать. Мне особенно не нравится смешивать функции, которые изменяют массив, с функциями, которые этого не делают, но в определенных сценариях вы можете получить некоторые улучшения производительности. Например, для очень длинного массива следующее изменение в исходном методе немного ускорит работу, сохраняя при этом удобочитаемость.
// add it at the beginning
filterArrayOfPersons.unshift({...person});
return filterArrayOfPersons;
Ни один из этих двух подходов не изменяет массив arrayOfPersons, вместо этого они возвращают копию с изменениями. Здесь вы можете узнать больше о методах мутации массива https://doesitmutate.xyz/
PS. Тип Человек может быть примерно таким:
export interface Person {
id: string;
name: string;
age: number;
}
Мир!
Спасибо :) Красиво и чисто
Вы хотите отсортировать по полю id?