Javascript对象:迭代属性

时间:2011-01-30 22:37:10

标签: javascript object properties iteration

我有一个变量,当打印到控制台时,它看起来像这样:

Object { PK-34={...}, PK-35={...}}

我正在为此变量添加一个size方法:

Model_value.size = function(obj) {
    var size = 0, key;
    for (key in obj) {
    if (obj.hasOwnProperty(key)) size++;
    }
    return size;
};

此方法返回0,并使用以下方法迭代这些属性:

for (foo in Model_value)
{
  //...
}

不起作用。

我如何迭代那些PK-34,PK-35属性?

1 个答案:

答案 0 :(得分:7)

如果size最终为零,显然有问题的对象是从其原型继承这些属性。在这种情况下,这意味着您不希望hasOwnProperty检查。

示例:

var Model_value = {};
Model_value.size = function(obj) {
    var size = 0, key;
    for (key in obj) {
    if (obj.hasOwnProperty(key)) size++;
    }
    return size;
};
Model_value.sizeInherited = function(obj) {
    var size = 0, key;
    for (key in obj) {
      size++;
    }
    return size;
};

function Foo() {
}
Foo.prototype["PK-34"] = {
  name: "I'm PK-34"
};
Foo.prototype["PK-35"] = {
  name: "I'm PK-35"
};

display("Model_value.size(new Foo()) = " + Model_value.size(new Foo()));
display("Model_value.sizeInherited(new Foo()) = " + Model_value.sizeInherited(new Foo()));

var f = {
  "PK-34": {name: "I'm PK-34"},
  "PK-35": {name: "I'm PK-35"}
};

display("Model_value.size(f) = " + Model_value.size(f));
display("Model_value.sizeInherited(f) = " + Model_value.sizeInherited(f));

var bar = new Foo();
bar["PK-36"] = {name: "I'm PK-36"};

display("Model_value.size(bar) = " + Model_value.size(bar));
display("Model_value.sizeInherited(bar) = " + Model_value.sizeInherited(bar));

Live copy

在第一种情况(new Foo())中,Foo创建的新对象没有自己的属性(只有继承的属性),因此size最终为0 } sizeInherited2(因为它从原型中继承了两个属性)。

在第二种情况下,由于f拥有拥有的 PK-34PK-35属性,因此size2。它没有继承原型中的属性,因此sizeInherited也是2

在第三种情况下,bar同时拥有两个继承的属性和一个属性,因此size3sizeInherited2


更新:编辑似乎有点改变了问题。如果您尝试在 Model_value中迭代属性,那么您不想接受参数,您想使用this

要查找它拥有多少拥有的属性:

Model_value.size = function() {
    var size = 0, key;
    for (key in this) {
        if (this.hasOwnProperty(key)) size++;
    }
    return size;
};

要查找它有多少属性 total (包括继承的属性):

Model_value.size = function() {
    var size = 0, key;
    for (key in this) {
        size++;
    }
    return size;
};

示例:

function Model() {
}
Model.prototype["PK-34"] = {
  name: "I'm PK-34"
};
Model.prototype["PK-35"] = {
  name: "I'm PK-35"
};

var Model_value = new Model();

Model_value.size = function() {
  var size = 0, key;
  for (key in this) {
      if (this.hasOwnProperty(key)) size++;
  }
  return size;
};

Model_value.sizeInherited = function() {
  var size = 0, key;
  for (key in this) {
      size++;
  }
  return size;
};

display("Model_value.size() = " + Model_value.size());
// ^-- returns 2 ("size" and "sizeInherited")

display("Model_value.sizeInherited() = " + Model_value.sizeInherited());
// ^-- returns 4 ("PK-34", "PK-35", "size", and "sizeInherited")

Live copy

请注意,我们添加到Model_value的功能已分配给属性,因此它们会显示在总计中。