Как отсортировать коллекцию объектов JavaScript по логическому строковому полю - PullRequest
0 голосов
/ 12 октября 2018

Я хочу отсортировать коллекцию следующим образом:

1) Сначала должен отображаться только столбец «shared == true», а все остальные должны быть после слов.попробовал с подходом ниже, но он не работает и показывает случайным образом.

var cmp= function (a, b) {  
            
            if (a.shared == 'true' && b.shared != 'true') return -1;
            if (a.shared != 'true' && b.shared == 'true') return 0;
            return 1;
        }
        
var data= [{'id':1, 'name':'addd', 'shared':'true'},{'id':2, 'name':'addd1', 'shared':'false'},{'id':3, 'name':'addd2', 'shared':'true'}]
data.sort(cmp);
console.log(data);

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

с фильтром и конкатом

var data = [{
  'id': 1,
  'name': 'addd',
  'shared': 'true'
}, {
  'id': 2,
  'name': 'addd1',
  'shared': 'false'
}, {
  'id': 1,
  'name': 'addd2',
  'shared': 'true'
}]


const sorted = data.filter(x => x.shared === 'true').concat(data.filter(x => x.shared !== 'true'));
console.log(sorted);
0 голосов
/ 12 октября 2018

Почти нет.Во втором if вы хотите вернуть 1. Если оба значения верны, вы хотите вернуть 0. Таким образом, ваш последний возврат должен быть return 0.

var cmp = function(a, b) {
  if (a.shared == 'true' && b.shared != 'true') return -1;
  if (a.shared != 'true' && b.shared == 'true') return 1;
  return 0;
}

var data = [{
  'id': 1,
  'name': 'addd',
  'shared': 'true'
}, {
  'id': 2,
  'name': 'addd1',
  'shared': 'false'
}, {
  'id': 1,
  'name': 'addd2',
  'shared': 'true'
}]
data.sort(cmp);
console.log(data);

Из описания :

if (a is greater than b by the ordering criterion) {
    return 1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...