使用对象属性进行迭代

Use object property for iteration

本文关键字:迭代 属性 对象      更新时间:2023-09-26

可以使用对象属性的"for in"-迭代在JavaScript?

我想写一个这样的Bag-Class:

var Bag = function () {
  this.elements = {};
}
Bag.prototype.add = function (key, value) {
  this.elements[key] = value;
};
// other methods ...

现在我想在迭代中使用这个类的对象:

for (var key in myBag) {
  console.log(myBag[key]); // or myBag.get(key);
}

有可能做到这一点,没有像var key在myBag.getAll()的辅助方法?

您可以将键/值对添加到实例本身,并将方法创建为不可枚举的,例如:

function Bag() {
}
Object.defineProperty(Bag.prototype, 'add', {
  enumerable: false,
  value: function(k, v) {
    this[k] = v
  }
})
var bag = new Bag
bag.add('a',1)
bag.add('b',2)
bag.add('c',3)
for (var k in bag)
  console.log(k)
//^ a
//  b
//  c

请注意,您也可以正常声明该方法,并始终使用hasOwnProperty check:

进行循环。
for (var k in bag)
  if (bag.hasOwnProperty(k))
    console.log(k)

或其他替代:

Object.keys(bag).forEach(function(k) {
  console.log(k)
})

这样如何,例如forEach,但你可以制作mapfilter或其他。

Javascript

(function () {
    'use strict';
    function Bag() {
        this.elements = {};
    }
    Bag.prototype = {
        add: function (key, value) {
            this.elements[key] = value;
        },
        forEach: function (fn, thisArg) {
            Object.keys(this.elements).forEach(function (key) {
                fn.call(thisArg, this[key], key, this);
            }, this.elements);
        }
    };

    var myBag = new Bag();
    myBag.add('one', 1);
    myBag.add('two', 2);
    myBag.add('three', 3);
    myBag.forEach(function (item, key, object) {
        console.log(this, item, key, object);
    }, 'hello');
}());

输出
hello 1 one Object {one: 1, two: 2, three: 3}
hello 2 two Object {one: 1, two: 2, three: 3}
hello 3 three Object {one: 1, two: 2, three: 3}
在jsFiddle