Создание итерации javascript, аналогичной python

#javascript

Вопрос:

Я хотел бы иметь возможность вызывать 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. Каков был бы правильный способ сделать элемент неисчислимым (только так a и b отображаться в качестве ключей)? Будет ли достаточно следующего?
     for (let prop of ['keys', 'values', 'items'])  Object.defineProperty(o, prop, {enumerable: false}) // or ['keys','values','items'].forEach((prop,idx) =gt; Object.defineProperty(o, prop, {enumerable: false}));  
  2. Будет ли вышесказанное (то, что я считаю удобным методом) считаться плохой идеей, и если да, то почему?

Комментарии:

1. Я понимаю, что вы хотите добавить свойство к этому объекту, чтобы вы могли легко получать ключи и значения, но я думаю, что лучший способ-это просто использовать записи объектов, подобные этому: for(const [key, value] of Object.entries(o)){console.log(key,value)}

2. @MatiasCoco понял, мне просто интересно, есть ли у этого реальный недостаток.

3. я не думаю, что это лучший способ, потому что вам нужно удалить ключи «ключ», «значения» и «элементы» из ключа «ключи» объекта. это сбивает с толку, и если вы работаете со многими объектами, это может замедлить работу вашего кода

4. @Bergi да, и это сработало. Я имел в виду, будет ли это работать и будет ли достаточно для моих целей-я новичок в JS и хочу убедиться, что он работает не только на консоли. журнал выглядит нормально».

5. » Будет ли это считаться плохой идеей? «…вероятно, да. Если вы используете объект в качестве записи, вам не нужно его повторять. Если вы используете объект в качестве словаря произвольных ключей, вы не можете зарезервировать keys , values entries например, методы. Только в нескольких отдельных случаях с произвольными ключами этот шаблон был бы разумным. Тем не менее, просто используйте Map вместо этого.

Ответ №1:

Вы можете добавить вспомогательные методы в объект 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()); 

Ответ №2:

Вы можете отредактировать методы прототипа, чтобы изменения были глобальными.

 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(), });