我尝试根据type
将JSON排序为多个数组,我当前的json是:
// current json file:
{
"res": [
{
"type" : "stream",
"price" : "3.99",
"id" : "13nee"
},
{
"type" : "stream",
"price" : "2.99",
"id" : "8ejwj"
},
{
"type" : "buy",
"price" : "3.99".
"id" : "9akwk"
},
...
]
}
我希望按type
将其排序为多个数组,如下所示:
var sorted = {
"stream" : [
{
"price" : "2.99",
"id" : "8ejwj"
},
{
"price" : ".99",
"id" : "13nee"
},
... // other objects with type: "stream"
],
"buy" : [
{
"price" : "3.99".
"id" : "9akwk"
},
... // other objects with type: "buy"
]
}
我已经尝试过了,但我能想到的唯一解决方案就是通过案例 - 运行if循环,如果大小写匹配类型,则将对象推送到数组。有更优雅的解决方案吗?
答案 0 :(得分:2)
var items = {};
var i = 0;
for(i; i < res.length; i += 1){
var resItem = res[i];
if(items.hasOwnProperty(resItem.type)){
items[resItem.type].push({price:resItem.price, id:resItem.id});
} else {
items[resItem.type] = [{price:resItem.price, id:resItem.id}];
}
}
JavaScript对象的属性经过哈希处理,因此您可以动态匹配并生成上述新对象。如果要应用井订单排序,则需要将其应用于新生成的项目对象的数组。
答案 1 :(得分:0)
第1步: 将JSON转换为jquery对象:
var x = jQuery.parseJSON( jsonString );
第2步: 使用underscore库的_.groupBy进行分组:
_.groupBy(x,'type');
对于x是数组或对象,可能需要进行一些调整。
编辑: 你不需要step1。只是做:
sorted = _.groupBy(json.res,'type');
答案 2 :(得分:0)
你可以用ECMA5做这样的事情。这通常会执行您在问题中指出的sort
和reduce
,因此您可以向数据中添加更多字段,而无需更改例程。它还保留原始数据。
的Javascript
var original = {
'res': [{
'type': 'stream',
'price': '3.99',
'id': '13nee'
}, {
'type': 'stream',
'price': '2.99',
'id': '8ejwj'
}, {
'type': 'buy',
'price': '3.99',
'id': '9akwk'
}]
},
sorted = {};
original.res.slice().sort(function (a, b) {
a = +(a.price);
b = +(b.price);
if (a < b) {
return -1;
}
if (a > b) {
return 1;
}
return 0;
}).reduce(function (acc, element) {
if (!acc[element.type]) {
acc[element.type] = [];
}
acc[element.type].push(Object.keys(element).filter(function (name) {
return name !== 'type';
}).reduce(function (prev, name) {
prev[name] = element[name];
return prev;
}, {}));
return acc;
}, sorted);
console.log(JSON.stringify(sorted));
输出
{
"stream": [{
"price": "2.99",
"id": "8ejwj"
}, {
"price": "3.99",
"id": "13nee"
}],
"buy": [{
"price": "3.99",
"id": "9akwk"
}]
}
上