2016-09-30 5 views
0

私はオブジェクトにいくつかのデータを保存する必要がある状況ですが、ブラウザの制限のためにそのデータのセット番号しか持てません。私のアプリもこのデータを取得できる必要があるので、プロパティのキーが識別子であるオブジェクトに格納しています。最も古い日付のプロパティを取得する

memory = { 
    13: { 
     last_updated: 241, 
     ... 
    }, 
    26: { 
     last_updated: 363, 
     .... 
    } 
} 

last_updatedもちろんのDate.now()文字列を次のようになります。

データは次のようになります。このオブジェクトは6つ以上のプロパティを持つことができません。その長さに達すると、私は古いデータを新しいデータに置き換える必要があります。オブジェクトの最も古いプロパティを取得するにはどうすればよいですか?

+0

各オブジェクトを見て、最も古い 'last_updated'値を持つオブジェクトを探してみましたか? FYI、 'Date.now()'は文字列ではなく数値を返します。 –

答えて

2

一つの方法は、これはmemoryオブジェクトから最新の6つの項目を取ると、最も古い1

var oldest = memory[Object.keys(memory).sort(function(a,b) { 
    return memory[b].last_updated - memory[a].last_updated 
}).pop()]; 
0

、ちょうど最後の更新されたタイムスタンプ、および最後のポップでオブジェクトキーを並べ替えることであろう。

var freshMemory = Object.keys(memory) 
    .map(function (k) { return [k, data[k]] }) 
    .sort(function (a, b) { return b[1].last_updated - a[1].last_updated; }) 
    .slice(0, 6) 
    .reduce(function (o, v) { o[v[0]] = v[1]; return o; }, {}); 

短い説明

  1. 2つ組(キーと値)
  2. を含む配列にオブジェクトを転送する.map方法と組み合わせるObject.keysは次に.sortがソートされますlast_updatedを逆順に配列
  3. .sliceは、最初の6つの項目を取ります。
  4. 、最後に.reduceは、2タプルの配列をオブジェクトに戻します。
0

あなたはこのような何かを行うことができます:あなたはこれだけが機能するためにはaddNew(...)機能を使って、オブジェクトに新しいプロパティを追加する必要が

var obj = {}; 
 
for(var i = 0;i < 5; i++){ 
 
    obj[i] = {date:Date.now() + i}; 
 
} 
 

 
function addNew(date){ 
 
    if(obj.length < 5){ 
 
     obj[obj.length] = {date:date}; 
 
     return; 
 
    } 
 
    var arr = []; 
 
    for(var prop in obj){ 
 
     arr.push({prop:prop,date:obj[prop].date}) 
 
    } 
 
    var last = arr.sort(function(a, b){return b.date-a.date})[0].prop; 
 
    obj[last].date = date; 
 
} 
 
addNew(Date.now() + 100); 
 
console.log(obj);

関連する問題