【问题标题】:Associative array not in order关联数组不按顺序
【发布时间】:2015-06-22 21:28:19
【问题描述】:

关联数组的顺序是这样的

A00 = > value1
A01 = > value2
B01 = > value3
B02 = > value4

但是在for循环后数组的顺序不起作用

for (var key in obj3) {
    $("#code_list1").append(obj3[key]);
}

控制台输出如图所示

【问题讨论】:

  • javascript 中没有关联数组,因此假设您确实有一个对象,并且对象中没有顺序,因此看不到有序迭代是完全正常的。
  • 补充@adeneo所说的,如果你有一个数组,你可以实现你自己的sort()逻辑来强制要求的顺序。查看您拥有的实际值将有助于提供更具体的答案。
  • 请查看带有控制台输出的附件图像。据我所知,jQuery for 循环注意维护数组的顺序 stackoverflow.com/questions/18804592/…
  • 维持订单和被订购是两个不同的东西。对象属性可以无特定顺序排列...

标签: javascript jquery


【解决方案1】:

像这样的Javascript对象不支持顺序,这是预期的行为。

您可以使用一些简单的方法从中提取键列表并对其进行排序。

然后使用排序列表做你需要的。

var keys = Object.keys(obj3).sort();

for (var i = 0; i < keys.length; i++) {
    console.log(keys[i]);
    $("#code_list1").append(obj3[keys[i]]);
}

http://jsfiddle.net/rmvoz6av/3/

按照 Robert 的建议,我将其更改为 Object.keys(),尽管一些较旧的 IE 浏览器不支持此功能。

【讨论】:

  • 也许Object.keys() 是提取对象的可枚举键的更优雅的方式。
  • 如何按值而不是键对相同的数组进行排序?
【解决方案2】:

在关联数组中,顺序并不重要。这是结构定义的一部分。当然,从逻辑上讲,必须有某种排序,以便计算机可以跟踪哪些条目在哪里,但不能保证排序是基于任何特定的。

这使得简单地依赖关联数组中元素的“自然顺序”变得很危险。如果你的 runtume 碰巧按照你想要的顺序排列东西,这可能是巧合。但是巧合的功能有一个令人讨厌的习惯,即在您最意想不到的时候打破它:运行时发生变化。 要遍历关联数组,使用某种基于键的排序,最好明确地对键进行排序

在 JavaScript 中,如果您将对象用作关联数组,那么Object.keys 函数提供了一种以方便、可排序的格式获取键的简单方法。浏览器支持这一点可以追溯到 IE9,如果您需要对早期浏览器的支持,很容易实现。

/**
 * Determine the relative positions of two keys.
 *
 * I don't know exactly how you're determining your ordering here,
 * but unless it's basic alphabetical order, you'll need a function
 * like this for sort() to work properly.
 *
 * @param {*} a - One of the keys to compare.
 * @param {*} b - The other key to compare.
 *
 * @return {Number} The relative positions of the two keys.
 *     - If a should come before b, return a number less than 0.
 *     - If b should come before a, return a number greater than 0.
 *     - If their ordering isn't important, return 0.
 */
function compareKeys(a, b) {
    // This implementation just does what JavaScript does normally
    // for sorting, but it should illustrate how to implement your own.
    if (a < b) { return -1; }
    if (a > b) { return 1; }
    return 0;
}

// The code to iterate over the array.
var keys = Object.keys(obj3).sort(compareKeys),
    key,
    i;
for (i = 0; i < keys.length; i += 1) {
    key = keys[i];
    $("#code_list1").append(obj3[key]);
}

【讨论】:

    猜你喜欢
    • 2011-06-21
    • 2016-11-17
    • 2013-07-05
    • 1970-01-01
    • 2020-06-03
    • 2020-02-29
    • 2015-05-23
    相关资源
    最近更新 更多