创建一个保留订单的javascript哈希表?

时间:2014-07-07 10:06:03

标签: javascript

我环顾四周,但似乎没有什么是我正在寻找的。我试图弄清楚你是否可以拥有一个也保留顺序的哈希表,但同时也可以通过键名(而不是索引号)来访问这些值。

假设我有一个哈希表:

var productsSelected = {
  cpu: "Core i7 2.4GHz",
  memory: "8GB",
  videoCard: "nVidia 6500-GTS",
  display: "27-inch LCD",
  extraBattery: "",
  antivirus: "",
  mouse: "Logitech 232",
  extendedWarranty: ""
}

我想使用Handlebars遍历此对象,并显示在订单确认页面中选择的产品列表。

订单确认清单中显示的产品需要按特定顺序排列。我不希望防病毒显示在列表的顶部,然后是CPU,例如。我希望它是CPU内存 - 视频卡等...

我考虑在键名中添加数字:

var productsSelected = {
  a100-cpu: "Core i7 2.4GHz",
  a110-memory: "8GB",
  a120-videoCard: "nVidia 6500-GTS",
  .
  .

但这是一种非常愚蠢的方法。

还有

var productsSelectedArray = [
  {cpu: "Core i7 2.4GHz"},
  {memory: "8GB"},
  {videoCard: "nVidia 6500-GTS"},
  {display: "27-inch LCD"},
  {extraBattery: ""},
  {antivirus: ""},
  {mouse: "Logitech 232"},
  {extendedWarranty: ""}
]

但那可以愚蠢地走过 - 也许吧?我如何循环它但只显示键名,例如?

理想情况下,保留顺序的哈希表适用于所有浏览器(我认为不同的浏览器会以不同的方式处理哈希表顺序),并且可以通过键(也可能通过索引)访问值,例如< / p>

productsSelected.memory返回&#34; 8GB&#34;

productsSelected[1].value也会返回&#34; 8GB&#34;

productsSelected[1].key可能会返回&#34;记忆&#34;

或类似的东西。

3 个答案:

答案 0 :(得分:3)

持久化顺序的地图也称为链接散列图。 这是一个链接,显示如何在javascript中构建一个:

http://dailyjs.com/2012/09/24/linkedhashmap/

如果您正在寻找使用javascript构建的解决方案,我认为它不存在。每个浏览器在遍历对象时都有自己的实现。

答案 1 :(得分:1)

为什么你不能只在数组中指定键,然后只是使用数组来按顺序访问属性?

var keys = ['cpu', 'memory', 'videoCard'];

for (var i = 0, l = keys.length; i < l; i++) {
  console.log(productsSelected[keys[i]]);
};

如果需要,您甚至可以将键作为对象的属性。

for (var i = 0, l = productsSelected.keys.length; i < l; i++) {
  console.log(productsSelected[productsSelected.keys[i]]);
};

DEMO

答案 2 :(得分:0)

在考虑更多之后 - 使用Underscore也无法做到这一点?

所有哈希都按照一定的顺序排列:

productsSelectedArray = [
  {cpu: "Core i7 2.4GHz"},
  {memory: "8GB"},
  {videoCard: "nVidia 6500-GTS"},
  {display: "27-inch LCD"},
  {extraBattery: ""},
  {antivirus: ""},
  {mouse: "Logitech 232"},
  {extendedWarranty: ""}
];

为了按顺序显示所有按键,我们可以使用下划线:

for (var i = 0, l = productsSelectedArray.length; i < l; i++) {
  console.log( _.keys(productsSelectedArray[i]) );
};

然后按顺序显示所有值,我们也可以使用Underscore。

for (var i = 0, l = productsSelectedArray.length; i < l; i++) {
  console.log( _.values(productsSelectedArray[i]) );
};