Переместить элемент в первую позицию в массиве

У меня есть такой объект:

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?

Mihai Alexandru-Ionut 05.05.2018 07:37

да, я хочу сортировать по идентификатору, только по идентификатору.

Mr world wide 05.05.2018 07:37

Назвать это «сортировкой» - плохой способ описать это. Все, что вам нужно сделать, это переместить запись с совпадающим id в первую позицию, вы не просите отсортировать другие записи в массиве по каким-либо критериям.

Makyen 05.05.2018 08:16
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
13
3
19 589
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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.info(data);

@Mrworldwide, no, item1 и item2 - это элементы, переданные в функцию обратного вызова для функции сортировки.

Mihai Alexandru-Ionut 05.05.2018 07:44

@Mrworldwide, вы хотите отсортировать массив, но оставить newSortingOrder первым?

Mihai Alexandru-Ionut 05.05.2018 07:51

@Mrworldwide, я обновил свой ответ. Пожалуйста, отредактируйте свой вопрос. Это не сортировка.

Mihai Alexandru-Ionut 05.05.2018 07:56

спасибо за помощь, я действительно ценю его ES5, поэтому я использую ответ @mamun.

Mr world wide 05.05.2018 07:57

@Mrworldwide, вы можете попробовать более простое решение: data.sort((a, b)=>{ if (b.id == stringToFilter) return 1;});

Mihai Alexandru-Ionut 05.05.2018 08:00

Прекрасный ответ, большое спасибо!

El7or 05.11.2019 17:05
Ответ принят как подходящий

Поскольку вы просто перемещаете один элемент наверх, я просто буду использовать 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.

В основном нам просто нужно:

  1. Отфильтровать человека из исходного массива
  2. Вставьте снова в начало
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;
}

Мир!

Спасибо :) Красиво и чисто

YTG 22.12.2020 17:23

Другие вопросы по теме