【问题标题】:have jquery not to sort associative array让 jquery 不对关联数组进行排序
【发布时间】:2018-01-29 20:51:57
【问题描述】:

如何防止 JavaScript 对我的关联数组进行排序?我需要以数字或数字作为字符串的关联数组的键,因为该数组是动态创建的。由于某些原因,JS一直为我排序,这给我带来了问题。顺便说一句,我正在使用 jquery-2.0.3.min.js:

HTML

<div id='output'></div>

JavaScript

//define array
var myUnsortArray={};
myUnsortArray[98+""]='first';
myUnsortArray[99+""]='second';
myUnsortArray[1+""]='third';
myUnsortArray[2+""]='last';

//output array
var a="";
$.each(myUnsortArray,function(key,value){a=a+key+": "+value+"<br/>";});
$("#output").html(a);

输出:

1: third
2: last
98: first
99: second

首选输出:

98: first
99: second
1: third
2: last

提前谢谢你!

【问题讨论】:

  • 您打算使用最终数量的字符串吗?似乎您需要构建一个大的开关/案例代码(特别是如果您想使用编号外部的final
  • 不,我不打算使用final,但是关联数组将用于其他目的,并且以数字为键是必不可少的。感谢您的检查。
  • 对此的标准答案是:JS 中“关联数组”(对象)中的键没有顺序。 Wich 并不完全正确,但由于规范不能保证顺序,因此您不应依赖它。如果您想保留顺序,您应该保留一个单独的列表,其中包含正确顺序的键。
  • 如果顺序很重要,请使用数组而不是对象字面量。 {} 不是 n 数组
  • 大多数情况下都是这样,除了 numeric uint32 键;甚至作为字符串。这似乎是对实际 JS 引擎中数据结构的一些内部优化。

标签: javascript jquery arrays sorting associative-array


【解决方案1】:

如何以不同的方式存储数据?代替由键:值对组成的对象,将其设为由值:位置对组成的数组:

let unsorted = [];
unsorted.push({value:"first", pos:"98"});
unsorted.push({value:"second", pos:"99"});
unsorted.push({value:"third", pos:"1"});
unsorted.push({value:"last", pos:"2"});

//output array
console.log(unsorted);

var a ="";
$.each(unsorted,function(index, item){
        console.log(item.value);
        a = a + item.pos + ": " + item.value + "<br/>";
    });

$("#output").html(a);

/* Output:
 * 98: first
 * 99: second
 * 1: third
 * 2: last
 */

【讨论】:

  • OP 不使用数组,只是键值对对象。
  • 我以为我在使用关联数组,可能我弄错了。
  • @xam javascript 没有关联数组...您使用的是对象文字,它们是无序的
【解决方案2】:

jQuery 不排序,这是 Javascript 在某些浏览器中的特定行为,因此无法确保插入顺序。

看看这段代码 sn-p 没有 jQuery 的.each 函数:

//define array
var myUnsortArray = {};
myUnsortArray[98 + ""] = 'first';
myUnsortArray[99 + ""] = 'second';
myUnsortArray[1 + ""] = 'third';
myUnsortArray[2 + ""] = 'last';

//output array
var a = "";
for (key in myUnsortArray) {
  a = a + key + ": " + myUnsortArray[key] + "<br/>";
}

$("#output").html(a);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<span id="output"></span>

看到了吗?没有 jQuery,键正在排序。

以下代码 sn-p 展示了如何使用 Map 类保留插入顺序:

var myUnsortMap = new Map();
myUnsortMap.set('98', 'first');
myUnsortMap.set('99', 'second');
myUnsortMap.set('1', 'third');
myUnsortMap.set('2', 'last');

//output array
var a = "";
for (var [key, value] of myUnsortMap) {
  a = a + key + ": " + value + "<br/>";
}

$("#output").html(a);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<span id="output"></span>

看到了吗?现在它遵循插入顺序。

【讨论】:

  • 但也要注意地图没有完整的浏览器支持
  • @charlietfl 确实如此,但是,这是一个示例,展示了保留插入顺序的替代方案。
  • "jQuery 没有排序,这是 javascript 在某些浏览器中的特定行为" 不,问题不在于浏览器。对象不是有序结构。你不应该将它们用于这样的事情。
  • 如果我不应该将对象用于这样的事情,因为它不是有序结构,那么我不应该使用对象。这是我能找到的最接近关联数组的方法。对于这样的事情,是否有任何可用的 JS 有序结构?我只是想在JS中使用一个简单的关联数组,看起来好复杂……谢谢输入
  • 两个答案都很好,但我更倾向于这个,以获得更深入的解释,并且 map 允许我搜索具有值的键,这类似于想要的关联数组。谢谢大家!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-20
  • 2016-02-01
  • 1970-01-01
  • 2012-12-17
  • 2015-06-11
相关资源
最近更新 更多