Упорядочивание массива, чтобы элемент с нулевым значением отображался последним

#javascript #arrays #sorting

#javascript #массивы #сортировка

Вопрос:

У меня есть следующий массив твитов:

 tweets: [{
    "body": "RT blah blah blah",
    "image": "",
    "screen_name": "billsmith",
    "timestamp": "2016-02-28 08:19:02"
}, {
    "body": "RT blah blah blah",
    "image": "http://www.image.com",
    "screen_name": "JoeBloggs_",
    "timestamp": "2016-06-28 07:37:40"
}]
  

Как мне упорядочить изображение, чтобы твиты с изображениями появлялись первыми? Итак, в принципе, я хочу, чтобы твиты с "image": "" появлялись последними.

Я попробовал следующую функцию для изменения порядка элементов, но она не работает:

   tweets.sort(function(a, b) {
      return a.image - b.image;
  });
  

Любые идеи приветствуются. Я рад использовать решение, которое использует обычный JavaScript или Lodash.

Ответ №1:

Вы могли бы использовать sort() вот так.

 var tweets = [{
  "body": "RT blah blah blah",
  "image": "",
  "screen_name": "billsmith",
  "timestamp": "2016-02-28 08:19:02"
}, {
  "body": "RT blah blah blah",
  "image": "http://www.image.com",
  "screen_name": "JoeBloggs_",
  "timestamp": "2016-06-28 07:37:40"
}]

tweets.sort(function(a, b) {
  if (b.image.length) {
    return 1;
  } else {
    return -1;
  }
})

console.log(tweets)  

Ответ №2:

Это предложение сортирует только заполненные строки сверху, а пустые строки снизу, без какой-либо другой сортировки.

 var tweets = [{ body: "RT blah blah blah", image: "", screen_name: "billsmith", timestamp: "2016-02-28 08:19:02" }, { body: "RT blah blah blah", image: "http://www.image.com", screen_name: "JoeBloggs_", timestamp: "2016-06-28 07:37:40" }];

tweets.sort(function(a, b) {
      return !a.image - !b.image;
});

console.log(tweets);  

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

1. Это сортирует по URL-адресу изображения, который не был запрошен OP, поэтому, возможно, нежелателен. Ответ Ненада Вракара, ИМХО, чище.

Ответ №3:

 var tweets = [{
  "body": "RT blah blah blah",
  "image": "",
  "screen_name": "billsmith",
  "timestamp": "2016-02-28 08:19:02"
},{
  "body": "RT blah blah blah",
  "screen_name": "billsmith",
  "timestamp": "2016-02-28 08:19:02"
}, {
  "body": "RT blah blah blah",
  "image": "http://www.image.com",
  "screen_name": "JoeBloggs_",
  "timestamp": "2016-06-28 07:37:40"
}]

tweets.sort(function(a, b) {
  return !a.image || a.image === "" ? 1 : -1;
})

console.log(tweets)