как выполнить пользовательскую сортировку массива на основе его состояния, за которым следует другое поле?

Таким образом, у меня есть массив, мне нужно отсортировать его по статусу в следующем порядке, т. е. failure->warn->>completed.
Обычно, я использую lodash для сортировки, но его немного сложный порядок здесь. Он также должен сортировать в соответствии с run после сортировки с run. Я не знаю, с чего начать.

var arr = [{"status":"failure","name":"one","run":1},
{"status":"failure","name":"two","run":2},
{"status":"warn","name":"three","run":1},
{"status":"warn","name":"four","run":2},
{"status":"completed","name":"five","run":1}]

2 ответа

  1. что-то вроде этого?

    1. Добавьте дополнительное свойство для ключа сортировки.
    var arrnew =   arr.map(function(item){
        switch(item.status){
        case "failure": 
        item.statusId=1;
        break;
        case "warn": 
        item.statusId=2;}
        //...
         return item} );
    
    1. Сортировка с помощью этого

    _.sortBy(arrnew, ‘statusId’);

  2. Сортировка на основе «статуса», а затем подразделы «выполнить» 1 или 2:

    let status_vals = [ "failure", "warn", "completed" ];
    
    let arr = [
      {"status":"failure","name":"one","run":1},
      {"status":"failure","name":"two","run":2},
      {"status":"warn","name":"three","run":1},
      {"status":"warn","name":"four","run":2},
      {"status":"completed","name":"five","run":1}
    ];
    
    function sortIt ( status_arr, sort_arr ) {
    
      let sorted_arr = [];
      status_arr.forEach ( d => {
        let temp = arr.filter ( obj => {
          return obj.status === d;
        } );  
    
        var length = temp.length;
        for ( var i = 0; i < length; i++ ) {
          if ( temp [ 0 ].run > temp [ i ].run ) {
            temp.push ( temp.shift ( ) );
          }
        }
    
        sorted_arr = [ ...sorted_arr, ...temp ];
      } );
    
      return sorted_arr;
    }
    
    sortIt ( status_vals, arr );