循环使用自定义顺序的javascript对象
loop through javascript object with customized order
我一直在寻找解决问题的方法,但似乎找不到任何答案。。。所以我不确定这是否可能。
我有一个带有产品信息的javascript对象,下面是它的样子(注意,它已经按照我想要的方式排序了):
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'}
}
我循环浏览它,为某个插件创建一个表,所以我如何获得信息的例子是:
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 p类别:图书评价:49.00
pid:7 pname:Abel p类别:图书评价:49.00
pid:10 pname:Walter p类别:图书评价:49.00
pid:211 pname:Devon p类别:图书评价:49.00
pid:212 pname:Carl p类别:图书评价:49.00
我需要它看起来像这样:
pid:7 pname:Abel p类别:图书评价:49.00
pid:212 pname:Carl p类别:图书评价:49.00
pid:211 pname:Devon p类别:图书评价:49.00
pid:2 pname:Sarah p类别:图书评价:49.00
pid:10 pname:Walter p类别:图书评价: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中的对象属性没有排序,所以理想情况下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);
} );
对象不是排序的,而是按顺序随机放置的,恰好您的浏览器会对Object键进行排序。
我建议将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);
});
- Chrome开发工具(如何知道我在调用哪个javascript对象)
- 循环遍历以数组为值的Javascript对象
- 从ajax请求中获取javascript对象
- 如何从对象的原型方法访问JavaScript对象属性
- 将XML转换为普通的旧JavaScript对象
- 通过引用传递JavaScript对象
- javascript对象操作:根据指定条件选择属性
- Javascript对象类在单击时打开窗口进行颜色选择,并在更改时替换对象背景颜色
- 如何在异步函数中使用javascript对象
- 临时Javascript对象
- 如何在ASP中为用户控件添加Javascript对象网
- 使用数组向下搜索Javascript对象
- Rails将JavaScript对象存储到Model的有效方式
- JavaScript对象不是从原型链继承的
- 如何创建具有默认值的JavaScript对象字段?(AngularJS模型相关)
- SetInterval在javascript对象中表现怪异
- Javascript 对象和 this 关键字
- 如何在不知道关键字的情况下访问javascript对象值
- 在 JavaScript 对象中设置要使用的运算符的属性
- 如何搜索JavaScript对象并更改值