JavaScript计算嵌套对象中的值

时间:2017-06-21 08:49:10

标签: javascript json loops object

我有一个看起来像这样的对象:

{
  "Boiler Emissions": {
                        "Manhattan": 2.7,
                        "Bronx": 3.2
                      },
  "Benzene Concentration": {
                             "Manhattan": 2.1,
                             "Bronx": 3.5
                           }
}

我想从两个子对象中计算ManhattanBronx的值,并获得如下所示的result

{
 "Manhattan": 4,8,
 "Bronx": 6,7
}

如何计算这些嵌套值?

6 个答案:

答案 0 :(得分:1)

您只需使用Object.keys()遍历对象的键并构建您的result对象。

这应该是你的代码:

var result = {Manhattan: 0, Bronx: 0};
Object.keys(obj).forEach(function(k){
        result.Manhattan += obj[k].Manhattan ? obj[k].Manhattan : 0;
        result.Bronx+= obj[k].Bronx ? obj[k].Bronx: 0;
});

<强>演示:

这是一个有效的演示:

&#13;
&#13;
var obj = {
  "Boiler Emissions": {
    "Manhattan": 2.7,
    "Bronx": 3.2
  },
  "Benzene Concentration": {
    "Manhattan": 2,
    "Bronx": 3.5
  }
};

var result = {Manhattan: 0, Bronx: 0};
Object.keys(obj).forEach(function(k){
        result.Manhattan += obj[k].Manhattan ? obj[k].Manhattan : 0;
        result.Bronx+= obj[k].Bronx ? obj[k].Bronx: 0;
});

console.log(result);
&#13;
&#13;
&#13;

答案 1 :(得分:0)

var obj={
    "Boiler Emissions": {
        "Manhattan": 2.7,
        "Bronx": 3.2
    },
    "Benzene Concentration": {
        "Manhattan": 2,1,
        "Bronx": 3.5
    }
};
var sums={};
for(values of obj){
 for(key in values){
  sums[key]= (sums[key]|| 0)  + values[key];
 }
}

console.log(sums);

简单地遍历主要对象。

答案 2 :(得分:0)

你需要使用过滤器数组方法。

 function filterByID(item) {

            if (item.CategoryID == viewCategoryProductID) {
                return true;
            }
            return false;
        }

这是一个过滤器数组方法,您需要传递数组的项并匹配值,它只返回匹配的值。

我希望它可以帮到你

答案 3 :(得分:0)

const obj = {
  "Boiler Emissions": {
                        "Manhattan": 2.7,
                        "Bronx": 3.2
                      },
  "Benzene Concentration": {
                             "Manhattan": 2.1,
                             "Bronx": 3.5
                           }
}

const output = Object.keys(obj)
  .map(measure => obj[measure])
  .reduce(
    (sumByCity, measure) => {
      Object
      .keys(measure)
      .map( city => sumByCity[city] = !sumByCity[city] ? measure[city] : sumByCity[city] + measure[city] )
      return sumByCity  
    }


  ,{})
console.log(output)

webpackbin demo

代码没有提及任何测量,因此您可以根据需要添加任意数量。如果您需要添加更多城市,那么城市也会发生同样的事情。并非所有测量都需要所有城市。所以,如果你有这样的事情:

const obj = {
  "Boiler Emissions": {
                        "Manhattan": 2.7,
                        "Bronx": 3.2,
                        "San Francisco": 3.2
                      },
  "Benzene Concentration": {
                             "Manhattan": 2.1,
                             "Bronx": 3.5,
                              "LA": 1.1
                           }
}

它仍然会输出正确的结果:

{
  Manhattan: 4.800000000000001,
  Bronx: 6.7,
  San Francisco: 3.2,
  LA: 1.1
}

答案 4 :(得分:0)

您可以执行以下操作;

&#13;
&#13;
var obj = { "Boiler Emissions"     : {"Manhattan": 2.7, "Bronx": 3.2},
            "Benzene Concentration": {"Manhattan": 2.1, "Bronx": 3.5}},
    res = Object.keys(obj).reduce((r,k) => Object.keys(obj[k]).reduce((o,p) => (o[p] = o[p] + obj[k][p] || obj[k][p], o), r), {});
console.log(res);
&#13;
&#13;
&#13;

答案 5 :(得分:0)

我们开始将object-scan用于此类数据处理任务。一旦将头缠住它,它就会非常强大。这是您回答问题的方式

const objectScan = require('object-scan');

const count = (input) => objectScan(['**'], {
  filterFn: ({ value, property, context }) => {
    if (typeof value === 'number') {
      context[property] = (context[property] || 0) + value;
    }
  }
})(input, {});

const data = {
  'Boiler Emissions': {
    Manhattan: 2.7,
    Bronx: 3.2
  },
  'Benzene Concentration': {
    Manhattan: 2.1,
    Bronx: 3.5
  }
};

console.log(count(data));
// => { Bronx: 6.7, Manhattan: 4.800000000000001 }