【问题标题】:Javascript Object: iterating over properties [duplicate]Javascript对象:迭代属性[重复]
【发布时间】:2011-06-18 06:40:17
【问题描述】:

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

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 属性?

【问题讨论】:

  • @Tim 对代码格式感到抱歉。感谢您的编辑。

标签: javascript object properties iteration


【解决方案1】:

如果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 最终是0sizeInherited 是@987654331 @(因为它从它的原型中继承了两个属性)。

在第二种情况下,因为f 有自己的 PK-34PK-35 属性,所以它的size2。它没有从它的原型继承任何属性,所以sizeInherited 也是2

在第三种情况下,bar 有两个继承属性和一个自己的属性,所以size3sizeInherited2


更新:编辑似乎稍微改变了问题。如果您尝试遍历 in 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 的函数已分配给属性,因此它们会显示在总数中。

【讨论】:

  • 干杯!现在说得通了。加上右侧令人印象深刻的“相关”链接阵列 - 足以让我了解 js。非常感谢您的及时回复!
  • @Val Redchenko:不用担心,很高兴有帮助。
猜你喜欢
  • 2014-04-16
  • 2016-02-26
  • 2013-04-04
  • 2012-07-23
  • 2012-02-14
  • 1970-01-01
  • 2021-12-04
  • 2023-03-24
  • 2015-09-22
相关资源
最近更新 更多