排序和操作json对象,javascript

时间:2015-03-24 14:21:14

标签: javascript arrays json angularjs underscore.js

我有一个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',如果与特定rate_pl相关的ios也添加值。

示例 - >结果应该是:

someObject = [
    {PlanC: ['ios':251]},              //(110+141 = 251)
    {SomePlan: ['ios':121]}
    ]; 

3 个答案:

答案 0 :(得分:1)

您可以使用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

答案 1 :(得分:1)

正如其他人所说的,因为你混合数组和对象,所以你想要它有点令人困惑。

如果您正在寻找此回复,只是为了帮助您:

{
    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);
}

如果您确实希望某些对象成为易于修改的数组。

答案 2 :(得分:1)

要做的第一件事是使用_.groupBy

按rate_pl对数组进行分组
var groups = _.groupBy(some_array,'rate_pl')

这将返回一个对象,其中键是不同的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 }
}