2016-05-02 3 views
0

私は以下の目的を持っている:スプライスのような機能をオブジェクト上で果たす方法は?

var data = { 
     'M.13-17': 0, 'M.18-24': 0, 'M.25-34': 0, 'M.35-44': 0, 'M.45-54': 0, 'M.55-64': 0, 'M.65+': 0, 
     'F.13-17': 0, 'F.18-24': 0, 'F.25-34': 0, 'F.35-44': 0, 'F.45-54': 0, 'F.55-64': 0, 'F.65+': 0, 
    }; 

は私のことができるようにしたい:

  1. は(のは5としましょう)まず、そのオブジェクトのプロパティを取得します。
  2. startオフセットを渡して、そのオブジェクトのNプロパティを取得します。

現在、私はオブジェクトプロパティの名前が暗黙指定されているソリューションを開発しましたが、より洗練されたソリューションを探しています。

+1

ようObject.prototype「GE最初のN個のプロパティ 'には意味がありません。プロパティには注文がありません。 – RJM

答えて

4

オブジェクトではプロパティの順序が保証されていないため(ES6の特定のケースまで)、できません。

あなたが安定したインデックスをしたい場合は、キーと値のペアの配列を使用する必要があります。

var data = [{ 
    key: 'M.13-17', value: 0 
}, { 
    key: 'M.18-24', value: 0 
}]; 

var firstFive = data.sort(function (it) { return it.key; }).splice(0, 5); 
console.log(firstFive); 
1

まあ、多くの手間をかけた後、私はそれがマップにオブジェクトを変換して適用するように行うことができると言うことができますスライス。私はその後、もちろん、あなたが拡張することもできますObject.entries()は、次のESバージョンで安定する一度この作業を簡単に処理されますが、今のようあなたが

...のような

var data = {'M.13-17': 0, 'M.18-24': 0, 'M.25-34': 0, 'M.35-44': 0, 'M.45-54': 0, 'M.55-64': 0, 'M.65+': 0, 'F.13-17': 0, 'F.18-24': 0, 'F.25-34': 0, 'F.35-44': 0, 'F.45-54': 0, 'F.55-64': 0, 'F.65+': 0}, 
 
    mdata = Object.keys(data).reduce((m,k) => m.set(k, data[k]), new Map()), // convert object to map 
 
    adata = [...mdata].splice(0,5); 
 
    odata = adata.reduce((o,a) => {o[a[0]] = a[1]; return o} ,{}) 
 

 
document.write("<pre>" + JSON.stringify(odata,null,2) + "</pre>");

を行うことができると信じて

var data = {'M.13-17': 0, 'M.18-24': 0, 'M.25-34': 0, 'M.35-44': 0, 'M.45-54': 0, 'M.55-64': 0, 'M.65+': 0, 'F.13-17': 0, 'F.18-24': 0, 'F.25-34': 0, 'F.35-44': 0, 'F.45-54': 0, 'F.55-64': 0, 'F.65+': 0}; 
 

 
Object.prototype.splice = function(s,e){ 
 
    var ok = Object.keys(this); 
 
    return ok.reduce((a,k) => a.concat([[k, this[k]]]), []).splice(s, e = e || ok.length).reduce((o,a) => {o[a[0]]=a[1]; return o} ,{}); 
 
} 
 

 
document.write("<pre>" + JSON.stringify(data.splice(0,5),null,2) + "</pre>");

関連する問題