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

How to accomplish splice-like functionality over 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 个属性。

目前,我已经找到了隐式指定对象属性名称的解决方案,但我正在寻找更优雅的解决方案。

你不能,因为对象不保证它们属性的顺序(直到 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);

好吧,在经历了很多麻烦之后,我可以说它可以通过将对象转换为地图然后应用切片来完成。我相信一旦 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>");

那么你当然可以选择扩展 Object.prototype 比如

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>");