web-dev-qa-db-ja.com

JavaScriptオブジェクトの配列をプロパティ値でソートする

JavaScriptオブジェクトの配列があります。私の配列は次のように定義されています:

var myObjects = [
  { id: '1', username: 'bill.jones', active: true, createdon: '03/29/2014' },
  { id: '2', username: 'woohoo', active: true, createdon: '03/28/2014' },
  { id: '3', username: 'someuser', active: true, createdon: '03/30/2014' }
];

この配列は実際に動的に設定されます。それでも、私は作成された値で昇順で結果をソートする必要があります。そのために、lodashを使用しようとしています。 createdon値は日付を表します。現在、私は次を試しています:

//  ORDER BY createdOn
myObjects.sort(function (a, b) {
  var date1 = new Date(a['createdon']);
  var date2 = new Date(b['createdon']);
  return date1 < date2;
});

_.forEach(myObjects, function(result) {
  console.log(result);
});

残念ながら、この関数を実行した後でもmyObjectsはソートされていません。私は何を間違えていますか?

ありがとうございました!

39
user70192

Lodash docを調べたところ、おそらく sortByを試すことができました

それを試してください: http://jsfiddle.net/3Wza8/

var myObjects = [
    { id: '1', username: 'bill.jones', active: true, createdon: new Date('03/29/2014') },
    { id: '2', username: 'woohoo', active: true, createdon: new Date('03/28/2014') },
    { id: '3', username: 'someuser', active: true, createdon: new Date('03/30/2014') }
];

myObjects = _.sortBy(myObjects, 'createdon');

_.forEach(myObjects, function (result) {
    console.log(result);
});

編集:Cookie Monsterが指摘したように、createdonフィールドは文字列ではなく日付であることが重要です。

72
lcoderre

問題は、sortが-1、0、または1を返す関数を期待していることです。関数は0と1のみを返します。

このわずかな変更により修正されます。

myObjects.sort(function (a, b) {
  var date1 = new Date(a['createdon']);
  var date2 = new Date(b['createdon']);
  return date1 - date2;
});
1
Frambot