简体   繁体   中英

How to perform operations on nested array of objects inside an array using javascript?

I am trying to calculate the average on nested array objects fields which is inside an another array. Here is the array I defined:

    let arr = [
[{"category":"behavioural", "rating":3}, {"category":"technical", "rating":4.5}],
[{"category":"behavioural", "rating":1}, {"category":"technical", "rating":2.5}],
[{"category":"behavioural", "rating":4}, {"category":"technical", "rating":2}]
]

I want to calculate the average of ratings in its respective category and store it in an object.

Expected output:

"metricsaverage" : {
    "behavioral" : 2.66,
    "technical" : 3
}

Where 2.66 and 3 is the average of all ratings with its respective category from the nested array of objects.

working example here: https://jsfiddle.net/galeroy/ot1pkvqg/4/

  let arr = [
      [{"category":"behavioural", "rating":3}, {"category":"technical", "rating":4.5}],
      [{"category":"behavioural", "rating":1}, {"category":"technical", "rating":2.5}],
      [{"category":"behavioural", "rating":4}, {"category":"technical", "rating":2}]
    ]

    var behavioralTotal = 0,
        behavioralItems = 0,
        technicalTotal = 0,
        technicalItems = 0;

    arr.forEach(function(outerItem){         
      outerItem.forEach(function(innerItem){
        if(innerItem.category === 'behavioural'){
          behavioralTotal += innerItem.rating;
          behavioralItems++;
        }
        else if (innerItem.category === 'technical')
        {
          technicalTotal += innerItem.rating;
          technicalItems++
        }
      })
    });

    console.log(
      'metricsaverage = { \n' +
        '"behavioral" : ' + (behavioralTotal/behavioralItems).toFixed(2) + ',\n' +
        '"technical" : ' + (technicalTotal/technicalItems).toFixed(2) + '\n' +
      '}'
    )

Working Demo:

 // Input array let arr = [ [{"category":"behavioural", "rating":3}, {"category":"technical", "rating":4.5}], [{"category":"behavioural", "rating":1}, {"category":"technical", "rating":2.5}], [{"category":"behavioural", "rating":4}, {"category":"technical", "rating":2}] ]; // Converting multi-dimensional array into single dimension. let singleDimensionArr = [].concat(...arr); // grouping by category and resulting with an object using Array.reduce() method const groupByCategory = singleDimensionArr.reduce((group, item) => { const { category } = item; group[category] = group[category]?? []; group[category].push(item.rating); return group; }, {}); // Finally calculating the average based on the category array we have. Object.keys(groupByCategory).forEach((item) => { const len = groupByCategory[item].length; groupByCategory[item] = groupByCategory[item].reduce((a, b) => a + b)/len; }) // result console.log(groupByCategory);

Try this

const array = [[{"category":"behavioural", "rating":3}, {"category":"technical","rating":4.5}],[{"category":"behavioural", "rating":1}, {"category":"technical", "rating":2.5}],[{"category":"behavioural", "rating":4}, {"category":"technical", "rating":2}]];

let arrBeh = [];
let arrTech = [];

array.forEach( e => {
    arrBeh.push(e[0]["rating"]);
  arrTech.push(e[1]["rating"]);
})

calcAvg = (arr) => {
    const sum = arr.reduce((a, b) => a + b, 0);
    const avg = (sum / arr.length) || 0;
  
  console.log(avg)
}

calcAvg(arrBeh);
calcAvg(arrTech);

The variable arr is referencing Array of Objects. I would iterate the array and retrieve the values as needed. So the syntax to iterate the array and get the rating value is: arr[i].rating where i is the counter variable.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM