排序和操作 json 个对象,javascript
sorting and manipulating json objects , javascript
我有一个 json 形式的回复:
some_array = [{
ios: "110"
rate_pl: "PlanC"
ref_site: "N/A"
reservation_id: "12709034"
},{
ios: "121"
rate_pl: "SomePlan"
ref_site: "FB"
reservation_id: "1273034
},{
ios: "141"
rate_pl: "PlanC"
ref_site: "Tweet"
reservation_id: "143034
}];
我如何对特定属性进行分组,比如 'rate_pl',如果 ios 与特定 rate_pl 相关,还添加值。
示例 --> 结果应为:
someObject = [
{PlanC: ['ios':251]}, //(110+141 = 251)
{SomePlan: ['ios':121]}
];
您可以使用 reduce 函数,如下所示:
var result = some_array.reduce(function(prev, cur) {
if (prev[cur.rate_pl] === undefined) {
prev[cur.rate_pl] = [];
prev[cur.rate_pl].push({ ios : parseInt(cur.ios, 10) });
} else {
prev[cur.rate_pl][0].ios += parseInt(cur.ios, 10);
}
return prev;
}, []);
小demo.
正如其他人所说,由于您混合了数组和对象,所以您想要的有点混乱。
只是为了帮助你,如果你正在寻找这个回复:
{
PlanC: {
ios: 251
},
SomePlan: {
ios: 121
}
}
您可以使用此代码:
var new_object = {};
for (var i = 0; i < some_array.length; i++) {
if (angular.isUndefined(new_object[some_array[i].rate_pl])) {
new_object[some_array[i].rate_pl] = {ios: 0};
}
new_object[some_array[i].rate_pl].ios += parseInt(some_array[i].ios);
}
如果您确实希望某些对象是应该易于修改的数组。
首先要做的是使用 _.groupBy:
按 rate_pl 对数组进行分组
var groups = _.groupBy(some_array,'rate_pl')
这将 return 一个对象,其键是不同的 rate_pl 值,值将是具有 rate_pl:
的所有对象的数组
{
PlanC: [ { ios: '110', etc }, {iod: '141' etc } ],
SomePlan: [ { ios: 121 etc } ]
}
接下来要做的是将值转换为您想要的(或类似于您想要的东西)。这可以使用 Underscore 1.8 中引入的 _.mapObject 来完成:
var result = _.mapObject(groups, function(rates){
return {
ios: _.reduce(rates, function(memo, rate){
return memo + parseInt(rate.ios);
}, 0)
}
});
这会给你:
{
PlanC: { ios: '251' },
SomePlan: { ios: 121 }
}
我有一个 json 形式的回复:
some_array = [{
ios: "110"
rate_pl: "PlanC"
ref_site: "N/A"
reservation_id: "12709034"
},{
ios: "121"
rate_pl: "SomePlan"
ref_site: "FB"
reservation_id: "1273034
},{
ios: "141"
rate_pl: "PlanC"
ref_site: "Tweet"
reservation_id: "143034
}];
我如何对特定属性进行分组,比如 'rate_pl',如果 ios 与特定 rate_pl 相关,还添加值。
示例 --> 结果应为:
someObject = [
{PlanC: ['ios':251]}, //(110+141 = 251)
{SomePlan: ['ios':121]}
];
您可以使用 reduce 函数,如下所示:
var result = some_array.reduce(function(prev, cur) {
if (prev[cur.rate_pl] === undefined) {
prev[cur.rate_pl] = [];
prev[cur.rate_pl].push({ ios : parseInt(cur.ios, 10) });
} else {
prev[cur.rate_pl][0].ios += parseInt(cur.ios, 10);
}
return prev;
}, []);
小demo.
正如其他人所说,由于您混合了数组和对象,所以您想要的有点混乱。
只是为了帮助你,如果你正在寻找这个回复:
{
PlanC: {
ios: 251
},
SomePlan: {
ios: 121
}
}
您可以使用此代码:
var new_object = {};
for (var i = 0; i < some_array.length; i++) {
if (angular.isUndefined(new_object[some_array[i].rate_pl])) {
new_object[some_array[i].rate_pl] = {ios: 0};
}
new_object[some_array[i].rate_pl].ios += parseInt(some_array[i].ios);
}
如果您确实希望某些对象是应该易于修改的数组。
首先要做的是使用 _.groupBy:
按 rate_pl 对数组进行分组var groups = _.groupBy(some_array,'rate_pl')
这将 return 一个对象,其键是不同的 rate_pl 值,值将是具有 rate_pl:
的所有对象的数组{
PlanC: [ { ios: '110', etc }, {iod: '141' etc } ],
SomePlan: [ { ios: 121 etc } ]
}
接下来要做的是将值转换为您想要的(或类似于您想要的东西)。这可以使用 Underscore 1.8 中引入的 _.mapObject 来完成:
var result = _.mapObject(groups, function(rates){
return {
ios: _.reduce(rates, function(memo, rate){
return memo + parseInt(rate.ios);
}, 0)
}
});
这会给你:
{
PlanC: { ios: '251' },
SomePlan: { ios: 121 }
}