如何在对象上实现类似拼接的功能?

时间:2016-05-02 18:46:26

标签: javascript javascript-objects

我有以下对象:

   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个属性。
  3. 目前,我已经解决了隐含指定对象属性名称的解决方案,但我正在寻找更优雅的解决方案。

2 个答案:

答案 0 :(得分: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 :(得分: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>");
&#13;
&#13;
&#13;

当然,您可以选择延长Object.prototype喜欢

&#13;
&#13;
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>");
&#13;
&#13;
&#13;