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

How to accomplish splice-like functionality over objects?

本文关键字:拼接 功能 实现 对象      更新时间:2023-09-26

我有以下对象:

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