【问题标题】:foreach object looping adding on top of the stackforeach 对象循环添加到堆栈顶部
【发布时间】:2012-08-27 11:02:03
【问题描述】:

我有一个 js,对象是这样的:

function test{
this.variable = {};
this.populate = function(){
  // do some crap....
  // and i populate the object like this
  this.variable{xyz..} = new object();
}
this.outputThecrap(){
for (var key in data) {
    if (data.hasOwnProperty(key)) {
     if(data[key].idParent != '0'){
            //do some stuff
     } 
     }
  }
}
this.addSomeOnBeginigQQ(){
  // how do i do that!!!!Q_Q
  this.variable{blabla...} = new blabla();
}
}

现在在我像

这样填充对象之后
var t = new test();
t.populate();
t.addSomeOnBegining();
t.outputThecrap();

我得到的问题是添加的属性在循环结束时结束......我需要它们在顶部

有人知道如何解决这个问题吗?

更新:

对象的结构不可更改。我也不能将数组用作容器,这是不可能的。

【问题讨论】:

  • 使用数组?不保证对象属性的迭代顺序是某种特定的顺序。
  • 什么是data?另外,我希望你的populate 函数只是伪代码,有很多语法问题
  • 这是伪乱码。而且这个对象实际上是一个 dom 对象,所以当我循环遍历它们时,顺序是有保证的。
  • 您不应该使用自定义属性扩展 DOM 对象 - 不,它们仍然没有顺序。请告诉我们你到底在用你的真实代码做什么
  • 抱歉不能那样做,那是公司财产......它就像 2k 行 js.... sooo :P

标签: javascript object loops add


【解决方案1】:

如果您想要一个堆栈,您将需要使用Array - 一个具有已定义顺序的列表。 JavaScript 中没有对象属性,没有像“关联数组”这样的东西。另外,你应该原型。

您可以像设置对象一样设置数组的属性,但属性名称必须是数字(即整数)。然后使用for-loop 循环它们。 Array objects 也有一些额外的方法,例如在开头或结尾添加项目(我在下面使用过):

function Test() {
    this.data = []; // an array
}
Test.prototype.populate = function(){
    // populate the array like this
    this.data.push({…});
};
Test.prototype.outputThecrap = function(){
    for (var i=0; i<this.data.length; i++) {
        var item = this.data[i];
        if (item /* has the right properties*/)
             //do some stuff
    } 
};
Test.prototype.addSomeOnBeginning(){
    this.data.unshift({…});
};

然后像这样使用它:

var t = new Test();
t.populate();
t.addSomeOnBeginning();
t.outputThecrap();

“有序键数组”如下所示:

function Test() {
    this.data = {}; // the object
    this.order = []; // an array
}
Test.prototype.populate = function(){
    this.data["something"] = {…}
    this.order.push("something");
};
Test.prototype.addSomeOnBeginning(){
    this.data["other"] = {…};
    this.order.unshift("other");
};
Test.prototype.outputThecrap = function(){
    for (var i=0; i<this.order.length; i++) {
        var key = this.order[i],
            item = this.data[key];
        if (item && key /* fulfill your requirements */)
             // do some stuff
    } 
};

【讨论】:

  • 这对我没用。我忘了提到我不能像你一样使用数组,因为我的对象必须是有序的,但包含某些有序的名称。所以我不能真正使用你的方法。
  • @Sangoku:一组(有序)键呢?这样,您可以保留当前的属性设计并通过该数组定义键的顺序。
  • 我不能。整个代码是在单例设计上制作的,所以我必须提供类似这个 object[someid].someproperty.function();我需要使循环穿过对象成为可能。
  • 那么你需要一个额外的对象键数组,你可以随意排序
  • 我找到了解决方案,jquery 有我工作需要的扩展功能;D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-20
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
  • 2013-05-20
  • 2020-09-10
  • 2015-03-27
相关资源
最近更新 更多