繁体   English   中英

使javascript迭代类似于python

[英]Making javascript iteration similar to python

我希望能够直接在对象上调用keys()values()items() ,作为Object.keys|values|entries(...)的一种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. 以上(我认为是一种方便的方法)是否会被认为是一个坏主意,如果是这样,为什么?

您可以将辅助方法添加到 Object.prototype 对象(基本上是所有 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(), });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM