使javascript迭代类似于python



我希望能够直接在对象上调用keys(),values()items(),作为Object.keys|values|entries(...)的一种简写形式。以下是目前为止的内容:

let o = {
a: 1,
b: 2,
keys()   {return Object.keys(this)},
values() {return Object.values(this)},
items()  {return Object.entries(this)}
};
for (let k of o.keys()) console.log(k);
for (let v of o.values()) console.log(v);
for (let [k,v] of o.items()) console.log(k,v);

似乎得到了我想要的,除了我不希望这个属性是可枚举的。与此相关的两件事:

  1. 使项目不可枚举(因此只有ab显示为键)的正确方法是什么?以下内容足够好吗?

    for (let prop of ['keys', 'values', 'items'])
    Object.defineProperty(o, prop, {enumerable: false})
    // or
    ['keys','values','items'].forEach((prop,idx) => Object.defineProperty(o, prop, {enumerable: false}));
    
  2. 以上(我认为是一个方便的方法)会被认为是一个坏主意,如果是,为什么?

您可以向对象添加辅助方法。原型对象(基本上是所有javascript对象的父对象),以便所有对象都有.keys(),.values().entries()方法。

const obj = {
a: 1,
b: 2
};
for (let prop of ['keys', 'values', 'entries']) {
Object.defineProperty(Object.prototype, prop, {
enumerable: false,
value: function() {
return Object[prop](this);
}
});
}
console.log(obj);
console.log(obj.keys());
console.log(obj.values());
console.log(obj.entries());

您可以编辑原型方法,这样更改将是全局的。

Object.prototype.keys = function(){ 
return Object.keys(this);
}
Object.prototype.entries = function(){ 
return Object.entries(this);
}
Object.prototype.values = function(){ 
return Object.values(this);
}
const test = {
name: "bob"
};
console.log({
keys: test.keys(), 
values: test.values(), 
entries: test.entries(),
});

相关内容

  • 没有找到相关文章

最新更新