好了,在网页上,我有我使用作为关联数组其中JavaScript对象。这在一个脚本块存在静态加载页面时:

var salesWeeks = {
    "200911" : ["11 / 2009", "Fiscal 2009"],
    "200910" : ["10 / 2009", "Fiscal 2009"],
    "200909" : ["09 / 2009", "Fiscal 2009"],
    "200908" : ["08 / 2009", "Fiscal 2009"],
    "200907" : ["07 / 2009", "Fiscal 2009"],
    "200906" : ["06 / 2009", "Fiscal 2009"],
    "200905" : ["05 / 2009", "Fiscal 2009"],
    "200904" : ["04 / 2009", "Fiscal 2009"],
    "200903" : ["03 / 2009", "Fiscal 2009"],
    "200902" : ["02 / 2009", "Fiscal 2009"],
    "200901" : ["01 / 2009", "Fiscal 2009"],
    "200852" : ["52 / 2008", "Fiscal 2009"],
    "200851" : ["51 / 2008", "Fiscal 2009"]
};

的键/值对的顺序是故意的,因为我转动对象到一个HTML选择框像这样:

<select id="ddl_sw" name="ddl_sw">
<option value="">== SELECT WEEK ==</option>
<option value="200911">11 / 2009 (Fiscal 2009)</option>
<option value="200910">10 / 2009 (Fiscal 2009)</option>
<option value="200909">09 / 2009 (Fiscal 2009)</option>
<option value="200908">08 / 2009 (Fiscal 2009)</option>
<option value="200907">07 / 2009 (Fiscal 2009)</option>
<option value="200906">06 / 2009 (Fiscal 2009)</option>
<option value="200905">05 / 2009 (Fiscal 2009)</option>
<option value="200904">04 / 2009 (Fiscal 2009)</option>
<option value="200903">03 / 2009 (Fiscal 2009)</option>
<option value="200902">02 / 2009 (Fiscal 2009)</option>
<option value="200901">01 / 2009 (Fiscal 2009)</option>
<option value="200852">52 / 2008 (Fiscal 2009)</option>
<option value="200851">51 / 2008 (Fiscal 2009)</option>
</select>

...与代码看起来像这样(从一个函数剪断):

var arr = [];
arr.push(
    "<select id=\"ddl_sw\" name=\"ddl_sw\">" +
    "<option value=\"\">== SELECT WEEK ==</option>"
);

for(var key in salesWeeks)
{
    arr.push(
        "<option value=\"" + key + "\">" +
        salesWeeks[key][0] + " (" + salesWeeks[key][1] + ")" +
        "<\/option>"
    );
}

arr.push("<\/select>");

return arr.join("");

这在所有IE,火狐和Opera工作正常。

然而,在浏览器,顺序出来所有怪异:

<select id="ddl_sw" name="ddl_sw">
<option value="">== SELECT WEEK ==</option>
<option value="200852">52 / 2008 (Fiscal 2009)</option>
<option value="200908">08 / 2009 (Fiscal 2009)</option>
<option value="200906">06 / 2009 (Fiscal 2009)</option>
<option value="200902">02 / 2009 (Fiscal 2009)</option>
<option value="200907">07 / 2009 (Fiscal 2009)</option>
<option value="200904">04 / 2009 (Fiscal 2009)</option>
<option value="200909">09 / 2009 (Fiscal 2009)</option>
<option value="200903">03 / 2009 (Fiscal 2009)</option>
<option value="200905">05 / 2009 (Fiscal 2009)</option>
<option value="200901">01 / 2009 (Fiscal 2009)</option>
<option value="200910">10 / 2009 (Fiscal 2009)</option>
<option value="200911">11 / 2009 (Fiscal 2009)</option>
<option value="200851">51 / 2008 (Fiscal 2009)</option>
</select>

注意:此命令,虽然怪异,不会对随后的刷新而改变。它总是在这个顺序。

那么,什么是浏览器做什么?在如何处理循环中的某优化?

首先,我错了依靠的是键/值对中声明的顺序上的任何的关联数组?

我从来没有怀疑过它之前,我只是认为顺序将保持,因为这项技术已经在其他浏览器总是为我工作。但我想我从来没有见过任何地方指出,为了保证。也许这不是?

任何了解将真棒。 感谢。

有帮助吗?

解决方案

想关联数组作为纸袋到其中所有的键 - 值对被放置的。当你到达你的手入袋看对(如与for ... in循环),那你遇到它们的顺序是所有的实际目的是随机的。

如果你想看到他们在一个特定的顺序,你需要的关键提取到一个数组和排序。然后在阵列上行走,使用遇到索引到关联阵列的密钥。

其他提示

其中元素存储在关联数组的顺序不被保证。你必须到您的输出明确排序。

至于其他的答案说,其中一个对象的属性迭代没有在规范中定义,尽管主流浏览器都重复他们在定义订单的订单。

铬将按顺序列举它们太,如果所有的对象的属性的包含原始值。约翰Resig的给出了更详细的关于Chrome的行为在这里(“for循环令”下): http://ejohn.org/blog/javascript-in-chrome/

正如指出Chrome的行为是完全有效的。

这是一些地方OO思想可以帮助一个很好的例子。难道你真的想要一个关联数组或只是一个对象列表?

var salesWeeks = [
    ["200911", "11 / 2009", "Fiscal 2009"],
    ...
]
...
for(var key in salesWeeks)
{
    arr.push(
        "<option value=\"" + salesWeeks[key][0] + "\">" +
        salesWeeks[key][1] + " (" + salesWeeks[key][2] + ")" +
        "<\/option>"
    );
}

会更好,我觉得(对那些鼓吹某种形式的排序,顺序已经被定义? - 你为什么想要做额外的工作)为您服务。

@curtainDog:NO!没有! “在。”用在JavaScript中Array对象是坏的 - 大多数这里的响应的整个观点是,“为..在”不保证任何顺序。此外,“用于..的”将抓住从对象的构造的原型的属性,不会迭代不存在的键。

@Samnan:该规范简单地说,迭代顺序不能保证;这意味着浏览器可以自由地有序进行迭代,在插入的顺序,随机顺序,或者其他但是他们可能。这就像一个哈希表 - 认为它是随机的,即使它发生在一些明显的才能出来。

我相当肯定,大多数浏览器寻找“的for..in”与Array对象,并以数字顺序,这样的事情不打破循环;然而,这不是真正在做什么谁使用它的方式大多数人认为它在做什么,并且应该避免,除非你特别需要的对象的型迭代。

这不是一个真正的好做法,但...

如果您添加一个空格值铬不会考虑值的号码,并不会按值排序。

示例:

<select>
  <option value=" 3">Third</option>
  <option value=" 1">First</option>
  <option value=" 2">Second</option>
</select>

在好的一面是,你有没有从ID添加,然后删除字母像有人建议的(不记得是否在这个或其他岗位有类似的问题),你可以很容易修剪,但大部分的时间的空间不理,如果你发布或让那些到另一个文件中,他们将只看到整数值不占空间。

相反,所有其他的答案,这肯定是浏览器的错误

<强>其原因是:

如果所述数据结构是像巴里纸袋然后说:

的值应始终randimized。这不是在铬的情况下

如果所述数据结构是连续的,则:

的值应该是在它们被添加到该结构中的序列中的

虽然其他浏览器按照第二种方法中,铬如下既不和仍然没有什么是排序顺序铬解释而被访问的数据结构组成。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top