以自定义顺序循环遍历javascript对象

以自定义顺序循环遍历javascript对象,javascript,object,for-loop,foreach,Javascript,Object,For Loop,Foreach,我一直在寻找我的问题的解决方案,但似乎找不到任何答案…所以我不确定这是否可能 我有一个带有产品信息的javascript对象,下面是它的样子(注意,它已经按照我想要的方式排序): 我循环使用它为某个插件创建一个表,下面是我如何获取信息的示例: for(var val in prodType) { console.log('pid: '+val + ' pname: '+prodType[val].prodname + ' pcategory: '+prodType[val].

我一直在寻找我的问题的解决方案,但似乎找不到任何答案…所以我不确定这是否可能

我有一个带有产品信息的javascript对象,下面是它的样子(注意,它已经按照我想要的方式排序):

我循环使用它为某个插件创建一个表,下面是我如何获取信息的示例:

for(var val in prodType) {
   console.log('pid: '+val 
   + ' pname: '+prodType[val].prodname
   + ' pcategory: '+prodType[val].prodtype 
   + ' pprice: '+prodType[val].prodprice);
}
我的问题是:我需要由prodname对其进行打印订购,但保持id不变-就像我提供它一样,因为我使用id进行进一步的DB处理。所以,现在它打印:

pid:2 pname:Sarah pcategory:Book pprice:49.00
pid:7 pname:Abel pcategory:Book pprice:49.00
pid:10 pname:Walter pcategory:Book pprice:49.00
pid:211 pname:Devon pcategory:Book pprice:49.00
pid:212 pname:Carl p类别:图书许可证:49.00

我需要它看起来像这样:

pid:7 pname:Abel pcategory:Book pprice:49.00
pid:212 pname:Carl pcategory:Book pprice:49.00
pid:211 pname:Devon pcategory:Book pprice:49.00
pid:2 pname:Sarah pcategory:Book pprice:49.00
pid:10 pname:Walter pcategory:Book pprice:49.00

有可能吗?如果是,怎么做?非常感谢

更新

我尝试过@go oleg解决方案,结果证明它对我的情况不起作用:(以下是我真实数据的示例:

var prodType = {
  '211' : {'prodname' : '601A - Blahblah','prodtype' : 'CD-ROM', 'prodprice' : '49.00'},
  '212' : {'prodname' : '601B - Blahblah','prodtype' : 'CD-ROM', 'prodprice' : '49.00'},
  '214' : {'prodname' : '601C - Blahblah','prodtype' : 'CD-ROM', 'prodprice' : '49.00'},
  '224' : {'prodname' : '614A - Blahblah','prodtype' : 'CD-ROM', 'prodprice' : '0.00'},
  '225' : {'prodname' : '614C - Blahblah','prodtype' : 'CD-ROM', 'prodprice' : '0.00'},
  '231' : {'prodname' : '614D - Blahblah','prodtype' : 'CD-ROM', 'prodprice' : '0.00'},
  '226' : {'prodname' : '702B - Blahblah','prodtype' : 'CD-ROM', 'prodprice' : '49.00'},
  '227' : {'prodname' : '702C - Blahblah','prodtype' : 'CD-ROM', 'prodprice' : '49.00'},
  '217' : {'prodname' : 'COLL2 - Blahblah','prodtype' : 'Manual', 'prodprice' : '49.00'},
  '16' : {'prodname' : 'COLV - Blahblah','prodtype' : 'DVD', 'prodprice' : '100.00'},
  '119' : {'prodname' : 'UM - Blahblah','prodtype' : 'Manual', 'prodprice' : '29.00'},
  '235' : {'prodname' : 'WDS - Blahblah','prodtype' : 'Manual', 'prodprice' : '49.00'},
  '208' : {'prodname' : 'WTPO1 - Blahblah','prodtype' : 'Manual', 'prodprice' : '49.00'},
  '195' : {'prodname' : 'WTPO2 - Blahblah','prodtype' : 'Manual', 'prodprice' : '49.00'}
}

javascript中的对象是未排序的,但它们是按顺序随机排列的,您的浏览器会对对象键进行排序

我建议将id添加到各个对象中,然后存储在有序数组中:

var prodType = [
  {'prodname' : 'Abel','prodtype' : 'Book', 'prodprice' : '49.00', 'id': 7},
  {'prodname' : 'Carl','prodtype' : 'Book', 'prodprice' : '49.00', 'id': 212},
  {'prodname' : 'Devon','prodtype' : 'Book', 'prodprice' : '49.00', 'id': 211},
  {'prodname' : 'Sarah','prodtype' : 'Book', 'prodprice' : '49.00', 'id': 2},
  {'prodname' : 'Walter','prodtype' : 'Book', 'prodprice' : '49.00', 'id': 10}
];
然后你可以做:

prodType.forEach(function(el){
   console.log('pid: '+ el.id
   + ' pname: '+ el.prodname
   + ' pcategory: '+ el.prodtype 
   + ' pprice: '+ el.prodprice);
});

javascript中的对象是未排序的,但它们是按顺序随机排列的,您的浏览器会对对象键进行排序

我建议将id添加到各个对象中,然后存储在有序数组中:

var prodType = [
  {'prodname' : 'Abel','prodtype' : 'Book', 'prodprice' : '49.00', 'id': 7},
  {'prodname' : 'Carl','prodtype' : 'Book', 'prodprice' : '49.00', 'id': 212},
  {'prodname' : 'Devon','prodtype' : 'Book', 'prodprice' : '49.00', 'id': 211},
  {'prodname' : 'Sarah','prodtype' : 'Book', 'prodprice' : '49.00', 'id': 2},
  {'prodname' : 'Walter','prodtype' : 'Book', 'prodprice' : '49.00', 'id': 10}
];
然后你可以做:

prodType.forEach(function(el){
   console.log('pid: '+ el.id
   + ' pname: '+ el.prodname
   + ' pcategory: '+ el.prodtype 
   + ' pprice: '+ el.prodprice);
});

JavaScript中的对象属性没有顺序,因此理想情况下,
prodType
应该是一个数组。如果无法更改
prodType
的格式/结构,则可以对键进行排序,然后查找与键关联的值:

var prodType = {
  '7' : {'prodname' : 'Abel','prodtype' : 'Book', 'prodprice' : '49.00'},
  '212' : {'prodname' : 'Carl','prodtype' : 'Book', 'prodprice' : '49.00'},
  '211' : {'prodname' : 'Devon','prodtype' : 'Book', 'prodprice' : '49.00'},  
  '2' : {'prodname' : 'Sarah','prodtype' : 'Book', 'prodprice' : '49.00'},
  '10' : {'prodname' : 'Walter','prodtype' : 'Book', 'prodprice' : '49.00'}
};

//`sort` will sort by the "dictionary" order and it looks like you want the opposite, so use `reverse`
Object.keys(prodType).sort().reverse().forEach( function (key) {

   console.log('pid: '+key 
   + ' pname: '+prodType[key].prodname
   + ' pcategory: '+prodType[key].prodtype 
   + ' pprice: '+prodType[key].prodprice);

} );
更新:正如@plalx所指出的,第一次使用排序函数进行您想要的排序要比使用默认排序然后进行反向排序快:

Object.keys(prodType).sort(function(a,b) {
  return a > b ? -1 : (a === b? 0 : 1);
}).forEach( function (key) {
   console.log('pid: '+key 
   + ' pname: '+prodType[key].prodname
   + ' pcategory: '+prodType[key].prodtype 
   + ' pprice: '+prodType[key].prodprice);
} );

JavaScript中的对象属性没有顺序,因此理想情况下,
prodType
应该是一个数组。如果无法更改
prodType
的格式/结构,则可以对键进行排序,然后查找与键关联的值:

var prodType = {
  '7' : {'prodname' : 'Abel','prodtype' : 'Book', 'prodprice' : '49.00'},
  '212' : {'prodname' : 'Carl','prodtype' : 'Book', 'prodprice' : '49.00'},
  '211' : {'prodname' : 'Devon','prodtype' : 'Book', 'prodprice' : '49.00'},  
  '2' : {'prodname' : 'Sarah','prodtype' : 'Book', 'prodprice' : '49.00'},
  '10' : {'prodname' : 'Walter','prodtype' : 'Book', 'prodprice' : '49.00'}
};

//`sort` will sort by the "dictionary" order and it looks like you want the opposite, so use `reverse`
Object.keys(prodType).sort().reverse().forEach( function (key) {

   console.log('pid: '+key 
   + ' pname: '+prodType[key].prodname
   + ' pcategory: '+prodType[key].prodtype 
   + ' pprice: '+prodType[key].prodprice);

} );
更新:正如@plalx所指出的,第一次使用排序函数进行您想要的排序要比使用默认排序然后进行反向排序快:

Object.keys(prodType).sort(function(a,b) {
  return a > b ? -1 : (a === b? 0 : 1);
}).forEach( function (key) {
   console.log('pid: '+key 
   + ' pname: '+prodType[key].prodname
   + ' pcategory: '+prodType[key].prodtype 
   + ' pprice: '+prodType[key].prodprice);
} );


也许将项目复制到一个数组中,然后对其进行排序?我不想打断您,但它是一个对象。就ECMA-262而言,它根本没有排序;甚至排序的事实也是一个特定于实现的细节。如果您想要排序,请使用数组(无论是保存键列表还是对象本身)并对其进行排序。请参阅此处讨论的跨浏览器问题(是的,这是
删除
操作员页面,但请阅读该部分)也许将项目复制到一个数组中,然后对其进行排序?我不想打断您,但它是一个对象。就ECMA-262而言,它根本没有排序;甚至排序的事实也是一个特定于实现的细节。如果您想要排序,请使用数组(无论是保存键列表还是对象本身)并对其进行排序。请参阅此处讨论的跨浏览器问题(是的,这是
删除
操作员页面,但请阅读该部分)事实上,对象键是无序的。你的解决方案仍然是正确的。这让我有点困惑,因为它表明它是无序的,但一旦我循环通过它,它是有序的??没有为键指定顺序,甚至没有顺序——排序、未排序、插入顺序或其他。对象只是属性的集合。a除此之外的任何东西都是特定于实现的。@Neal:除了你现在说它们没有排序。即使这样也没有。它们可以是,也可以不是,由浏览器随意决定。顺序/排序是未指定的。@cHao我写道“你的浏览器对对象键进行排序只是碰巧而已”事实上,对象键是无序的。你的解决方案仍然是正确的。这让我有点困惑,因为它表明它是无序的,但一旦我循环通过它,它是有序的??没有为键指定顺序,甚至没有顺序——排序、未排序、插入顺序或其他。对象只是属性的集合。一个除此之外的一切都是特定于实现的。@Neal:除了你现在说它们没有排序。即使这样也没有。它们可以是,也可以不是,由浏览器随意决定。顺序/排序是未指定的。@cHao我写道“你的浏览器对对象键进行排序只是碰巧而已”+1为了保持原始结构,如果需要,快速查找可能是个好主意,但是
sort().reverse()
不是很有效,应该
.sort(函数(a,b){返回a>b-1:(a==b?0:1);});
取而代之。我喜欢你的想法-我可以将其更新为数组,但我只是希望我不必这样做。它可以用简单的词来工作,但由于某种原因,我目前的情况不起作用。我将用最接近我的对象的示例来更新我的问题。谢谢!@plalx:谢谢!更新了answer@Fabi:您希望在中输出什么更新后的示例是什么样子的?您希望输出按
id
排序,还是希望输出的顺序与您编写的完全相同。正如其他人所指出的,后者是不可能的,因为JavaScript不维护对象属性的任何排序顺序。
prodType
是如何生成的我想要