Как отсортировать данные объекта карты по значению вместо его ключа?

#javascript #reactjs #ecmascript-6

#javascript #reactjs #ecmascript-6

Вопрос:

Я пытаюсь выяснить, есть ли способ отсортировать данные объекта карты не по ключу (app.id ) но по значению (app.description). Например, у меня есть следующие данные, которые поступают с использованием следующего кода:

 let newMap = new Map();
_.forEach(this.props.applicationTypes.APPLICATION_TYPE, (appType) => {
  newMap.set(appType.id, appType.description);
});
this.setState({applicationTpeMap: newMap});

[[Entries]]
  0: {234 => "Technical Assistance"}
  1: {235 => "Initiative Project"}
  2: {236 => "Project scoping"}
  3: {231 => "Plan"}
  4: {232 => "Project"}
  5: {233 => "Management Cost"}
  

Я могу отсортировать эти данные, используя метод сортировки javascript, но он сортирует данные на основе идентификатора, как показано ниже:

 let newMap = new Map();
_.forEach(this.props.applicationTypes.APPLICATION_TYPE, (appType) => {
  newMap.set(appType.id, appType.description);
});
const mapAsc = new Map([...newMap.entries()].sort());
this.setState({applicationTpeMap: mapAsc});

[[Entries]]
  0: {231 => "Plan"}
  1: {232 => "Project"}
  2: {233 => "Management Cost"}
  3: {234 => "Technical Assistance"}
  4: {235 => "Initiative Project"}
  5: {236 => "Project scoping"}
  

то, что я ищу, это что-то вроде этого, где данные сортируются по описанию, такому как следующее:

Желаемый результат:

 [[Entries]]
0: {235 => "Initiative Project"}
1: {233 => "Management Cost"}
2: {231 => "Plan"}
3: {232 => "Project"}
4: {236 => "Project scoping"}
5: {234 => "Technical Assistance"}
  

Ответ №1:

Вы можете использовать entries() и отсортировать этот массив и сгенерировать новый map .

 let newMap = new Map();
newMap.set(234, "Technical Assistance");
newMap.set(235, "Initiative Project");
newMap.set(236, "Project scoping");
newMap.set(231, "Plan");
newMap.set(232, "Project");
newMap.set(233, "Management Cost");
const sorted = new Map([...newMap.entries()].sort((a, b) => a[1].localeCompare(b[1])));
console.log([...sorted.entries()]);  
 .as-console-wrapper { max-height: 100% !important; top: 0; }  

Комментарии:

1. Большое тебе спасибо @Hassan! Это сработало как шарм.