【问题标题】:Associative array loop order [duplicate]关联数组循环顺序
【发布时间】:2013-07-05 12:58:32
【问题描述】:

我有一个关联数组(对象),用于存储从第 3 方加载的数据。

// 3rdPartyData is also an associative array
for(var key in 3rdPartyData) {
  cookie[key] = 3rdPartyData[key];
}

我的对象最后被存储到一个 cookie 中,并在之前从一个 cookie 中加载(如果不存在 cookie,则创建 {})。

每个页面视图都会在我的 cookie 数组中添加或更新来自第 3 方的数据。

问题:如果我戴着看饼干,循环是否总是按他们佩戴的顺序将每个键添加到其中,还是会改变顺序?

如果可以,谁能提供有关如何管理此类事情的想法?

【问题讨论】:

  • 对象中键的顺序很简单,但您可以创建一个对象数组。
  • @elclanrs “微不足道”?这个词对吗?
  • JavaScript 没有关联数组。您可能在谈论对象键,并且不能保证它们的顺序。
  • @dystroy:我的意思是这并不重要,因为你已经命名了键吗?
  • 那么你建议我怎么做呢?我真的不想在一个循环中创建一个循环。

标签: javascript


【解决方案1】:

for(var key in some_object) 中键的顺序可以是任意的,当然并不总是排序的,但您可以强制为您想要的顺序:

for(var key in Object.keys(3rdPartyData).sort(keysSorter) {
    cookie[key] = 3rdPartyData[key];
}

keysSorter = function(a, b) {
    if (a === b) { // Should not actually be the case when sorting object keys
        return 0; 
    }
    // Compare a and b somehow and return 1 or -1 accordingly
    return a < b ? 1 : -1;
}

并确保Object.keys() 能够正常工作:

Object.keys = Object.keys || function(o) {  
    var result = [];  
    for(var name in o) {  
        if (o.hasOwnProperty(name))  
            result.push(name);  
        }  
    return result;  
};

【讨论】:

  • 请注意,不是每个浏览器都支持Object.keys(3rdPartyData)。 IE
  • 是的,但是很容易添加...
  • @Olegas:我猜你的意思是“每个浏览器都不支持”。 Firefox 和 Chrome 支持它。
  • @FelixKling 是的,谢谢。
猜你喜欢
  • 2012-01-01
  • 1970-01-01
  • 2019-03-07
  • 1970-01-01
  • 2014-02-16
  • 1970-01-01
  • 1970-01-01
  • 2015-06-22
  • 1970-01-01
相关资源
最近更新 更多