Create Multidimensional array of [key,value] with key unique count as value from Array of JSON Object

浪子不回头ぞ 提交于 2021-01-29 09:28:50

问题


Currently i have array of json object returned by server

data: [
  {
    billed: "No",
    designation: "ASE",
    involvement: "Full Time",
    name: "Rishi Ranabhat",
    project: "ABC"
  },
  {
    billed: "No",
    designation: "ASE",
    involvement: "Full Time",
    name: "Biplap Bhattarai",
    project: "DEF"
  },
  {
    billed: "No",
    designation: "SE",
    involvement: "Part Time",
    name: "Ram k",
    project: "DEF"
  },
   ...more json data
];

I have to create a count of values in Array like below for representation for google charts:

[
  //designation count
  ["ASE", 2],
  ["SE", 2]
],
  [
    //project count
    ["ABC", 1],
    ["DEF", 2]
  ],
  //and similarly others.

How can i count the no of occurances of the keys with the values of previous occurance intact, and also in ['key','value'] of key being the unique occurance of data and value being the no of occurance ???


回答1:


Iterate over the data with reduce to create an object grouped by type. Here's a reusable function - just pass in the data and the type.

const data = [{"billed":"No","designation":"ASE","involvement":"Full Time","name":"Rishi Ranabhat","project":"ABC"},{"billed":"No","designation":"ASE","involvement":"Full Time","name":"Biplap Bhattarai","project":"DEF"},{"billed":"No","designation":"SE","involvement":"Part Time","name":"Ram k","project":"DEF"}];

function getCount(data, type) {

  // `map` out the data by type
  const typeArr = data.map((obj) => obj[type]);

  // Iterate over the type data. We pass in an initial
  // object to capture the counts, so we need to use
  // `Object.values` to grab the object values at the end
  // of the iteration
  return Object.values(typeArr.reduce((acc, id) => {

    // If the key doesn't exist in the accumulator object
    // create it and create a new array at its value
    acc[id] = acc[id] || [id, 0];

    // Increment the second index (the count)
    acc[id][1]++;

    // Return the object for the next iteration
    return acc;
  }, {}));
}

console.log(getCount(data, 'designation'));
console.log(getCount(data, 'project'));

Further reading

  • reduce
  • Object.values

Alternatively, if you wanted to do this in one operation and return an object containing the grouped information, you could use another reduce to iterate over the main data keys:

const data = [{"billed":"No","designation":"ASE","involvement":"Full Time","name":"Rishi Ranabhat","project":"ABC"},{"billed":"No","designation":"ASE","involvement":"Full Time","name":"Biplap Bhattarai","project":"DEF"},{"billed":"No","designation":"SE","involvement":"Part Time","name":"Ram k","project":"DEF"}];

function getCounts(data) {

  // Grab the data keys. It assumes that each object in
  // the array has the same keys
  const keys = Object.keys(data[0]);

  // Using `reduce` iterate over the keys to build
  // up an object that groups the results from the inner
  // `reduce` operation by key
  return keys.reduce((out, key) => {

    // `map` out the data by type
    const typeArr = data.map((obj) => obj[key]);

    // Iterate over the type data. We pass in an initial
    // object to capture the counts, so we need to use
    // `Object.values` to grab the object values at the end
    // of the iteration
    out[key] = Object.values(typeArr.reduce((acc, id) => {

      // If the key doesn't exist in the accumulator object
      // create it and create a new array at its value
      acc[id] = acc[id] || [id, 0];

      // Increment the second index (the count)
      acc[id][1]++;

      // Return the object for the next iteration
      return acc;
    }, {}));
    
    // Return the `out` object for the next iteration
    return out;

  }, {});

}

console.log(getCounts(data));



回答2:


Lot's of ways to do this. Here is a simple way (could be cleaned up, but just trying to demo):

View on JSFiddle

const data = [{
    billed: "No",
    designation: "ASE",
    involvement: "Full Time",
    name: "Rishi Ranabhat",
    project: "ABC"
  },
  {
    billed: "No",
    designation: "ASE",
    involvement: "Full Time",
    name: "Biplap Bhattarai",
    project: "DEF"
  },
  {
    billed: "No",
    designation: "SE",
    involvement: "Part Time",
    name: "Ram k",
    project: "DEF"
  }
];

const designations = [],
      projects = [];

for (const record of data) {
  // Count designations
  if (!designations[record.designation]) {
    designations[record.designation] = 0;
  }
  
  designations[record.designation] = designations[record.designation] + 1;

  // Count projects
  if (!projects[record.project]) {
    projects[record.project] = 0;
  }
  projects[record.project] = projects[record.project] + 1;
}

// Merge sets
const final = [designations, projects];

console.log(final);



回答3:


const data = [
  {
    billed: "No",
    designation: "ASE",
    involvement: "Full Time",
    name: "Rishi Ranabhat",
    project: "ABC"
  },
  {
    billed: "No",
    designation: "ASE",
    involvement: "Full Time",
    name: "Biplap Bhattarai",
    project: "DEF"
  },
  {
    billed: "No",
    designation: "SE",
    involvement: "Part Time",
    name: "Ram k",
    project: "DEF"
  }
];

const result = data.reduce((acc,cur) => {
  for(let k in cur) {
    if(!acc[k]) {
      acc[k] = [[cur[k], 1]];
    } else {
      const idx = acc[k].findIndex(e => e[0] === cur[k]);
      if(idx !== -1) {
        acc[k][idx][1]++
      } else {
        acc[k].push([cur[k], 1])
      }
    }
  }
  return acc;
}, {});

console.log(result)


来源:https://stackoverflow.com/questions/58523404/create-multidimensional-array-of-key-value-with-key-unique-count-as-value-from

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!