Javascript 如何将具有属性的对象数组与另一个数组分组

Javascript 如何将具有属性的对象数组与另一个数组分组,javascript,arrays,json,Javascript,Arrays,Json,我有这个阵列: var arr = [ { count: 27, dataRil: "08/06/21", subCateg: "FISH", }, { count: 22, dataRil: "08/06/21", subCateg: "DOG", }, { count: 28, dataRil: "09/06/21&qu

我有这个阵列:

var arr = [
  {
    count: 27,
    dataRil: "08/06/21",
    subCateg: "FISH",
  },
  {
    count: 22,
    dataRil: "08/06/21",
    subCateg: "DOG",
  },
  {
    count: 28,
    dataRil: "09/06/21",
    subCateg: "FISH",
  },
  {
    count: 18,
    dataRil: "09/06/21",
    subCateg: "DOG",
  },
  {
    count: 1,
    dataRil: "09/06/21",
    subCateg: "CAT",
  },
  {
    count: 1,
    dataRil: "09/06/21",
    subCateg: "BIRD",
  },
];
我想按标签对它进行分组,在数据元素中,我想要数组中的计数。 我怎样才能做到这一点

输出如下:

var datasets = [
  {
    label: "FISH",
    data: [27, 28],
  },
  {
    label: "DOG",
    data: [22, 18],
  },
  {
    label: "CAT",
    data: [0, 1],
  },
  {
    label: "BIRD",
    data: [0, 1],
  },
];

我会用一个经典的直方图方法把它变成一个对象,然后把它变成一个数组

var arr = [
  { count: 27, dataRil: "08/06/21", subCateg: "FISH" }, 
  { count: 22, dataRil: "08/06/21", subCateg: "DOG" }, 
  { count: 28, dataRil: "09/06/21", subCateg: "FISH" }, 
  { count: 18, dataRil: "09/06/21", subCateg: "DOG" }, 
  { count: 1, dataRil: "09/06/21", subCateg: "CAT" }, 
  { count: 1, dataRil: "09/06/21", subCateg: "BIRD" } 
]

let tempObj = {}

arr.forEach(el => {
  if (tempObj.hasOwnProperty(el.subCateg)) {
    tempObj[el.subCateg].data.push(el.count)
  } else {
    tempObj[el.subCateg] = {data: [el.count]}
  }
})

let newArr = []

let longestData = 0

//get the longest data array
Object.keys(tempObj).forEach(key => {
  if (tempObj[key].data.length > longestData) longestData = tempObj[key].data.length
})

Object.keys(tempObj).forEach(key => {
  if (tempObj[key].data.length < longestData) {
    for (let i = tempObj[key].data.length; i < longestData; i++){
      tempObj[key].data.unshift(0)
    }
  }
})


Object.keys(tempObj).forEach(key => newArr.push({"label": key, "data": tempObj[key].data}))

console.log(newArr)
var-arr=[
{计数:27,dataRil:“08/06/21”,子类别:“鱼”},
{计数:22,dataRil:“08/06/21”,子类别:“狗”},
{计数:28,dataRil:“09/06/21”,子类别:“鱼”},
{计数:18,dataRil:“09/06/21”,子类别:“狗”},
{计数:1,dataRil:“09/06/21”,子类别:“CAT”},
{计数:1,dataRil:“09/06/21”,子类别:“鸟”}
]
设tempObj={}
arr.forEach(el=>{
if(临时hasOwnProperty(el.子类别)){
tempObj[el.subcatege].data.push(el.count)
}否则{
tempObj[el.subcatege]={data:[el.count]}
}
})
让newArr=[]
设longestData=0
//获取最长的数据数组
Object.keys(tempObj).forEach(key=>{
如果(tempObj[key].data.length>longestData)longestData=tempObj[key].data.length
})
Object.keys(tempObj).forEach(key=>{
if(tempObj[key].data.lengthnewArr.push({“label”:key,“data”:tempObj[key].data}))
console.log(newArr)


编辑:添加代码以填充较短的数组

如果不希望元素的数据中包含0,则此操作可能有效。我不知道在您的情况下0是什么,但这可能会起作用

编辑:逻辑已更新。我认为您正在尝试用0预先填充您前面剩余的元素。当前解决方案将在前面用0填充剩余长度的数组

var initialArray=[{count:27,dataRil:“08/06/21”,子类别:“FISH”},{count:22,dataRil:“08/06/21”,子类别:“DOG”},{count:28,dataRil:“09/06/21”,子类别:“FISH”},{count:18,dataRil:“09/06/21”,子类别:“DOG”},{count count 1,dataRil:“09/06/21”,子类别:“CAT”},{count 1,dataRil:“09/06/21”,子类别:“BIRD”];
var arr=initialArray.reduce((累计,当前)=>{
if(累计[当前子类别]==未定义){
累计[当前子类别]={
标签:当前子类别,
数据:[当前计数]
};
返回累计;
}
让计数=累计[当前子类别]['data'];
计数推送(当前计数);
返回累计;
},{});
var arr=对象值(arr);
var maxLength=arr.map(x=>x.data.length).reduce((max,val)=>max>val?max:val);
var结果=arr.map((数据)=>{
if(data.data.lengthconsole.log(“结果”,Result)如果我正确理解了这个问题,首先我们要根据日期重新格式化数据。而且我们也不确定子类别,所以在重新格式化之前,我们将提取所有子类别值

然后,我们可以从更新/重新格式化的数据中提取所需的数据

const arr=[{
计数:27,
dataRil:“08/06/21”,
子类别:“鱼”,
},
{
计数:22,
dataRil:“08/06/21”,
子类别:“狗”,
},
{
计数:28,
dataRil:“09/06/21”,
子类别:“鱼”,
},
{
计数:18,
dataRil:“09/06/21”,
子类别:“狗”,
},
{
计数:1,
dataRil:“09/06/21”,
子类别:“猫”,
},
{
计数:1,
dataRil:“09/06/21”,
子类别:“鸟”,
},
];
const dataOnDate={};
常量数据集=[];
常量子类别=[];
函数getFormattedData(){
arr.forEach(er=>{
if(子类别包括(er.子类别)==false){
子类别推送(er子类别);
}
if(dataOnDate[er.dataRil]==未定义){
dataOnDate[er.dataRil]={};
}
dataOnDate[er.dataRil][er.subcatege]=er.count;
});
}
getFormattedData();
函数extractData(){
常量数据集=[];
子类别forEach(类别=>{
让mid={
标签:猫,
数据:[]
};
key(dataOnDate).forEach(data=>{
if(dataOnDate[data][cat]!==未定义){
mid.data.push(dataOnDate[data][cat])
}否则{
mid.data.push(0);
}
});
数据集推送(mid);
});
返回数据集;
}
const result=extractData();

控制台日志(结果)你又在问同样的问题。但在你不清楚自己到底想要什么之前,这是没有用的?试试自己的。若你们被卡住了,那个么问问题?上一次你问了我问过的同一个问题,关于
0
在label
CAT
BIRD
中从何而来实际上,CAT/BIRD的情况并不清楚。在这种情况下,“data”属性中带有dataRil的元素被添加到0。重要的是所有属性“data”的数组必须具有相同的长度谢谢,这是一个好方法,但对于BIRD和CAT的属性“data”,它是[1],而不是[0,1],我已经修改了代码,所以现在它用0填充数据数组,直到它们都与最长的自然数据数组一样长。是的,确实,我必须建立一个直方图。但是如果我添加一个新元素{count:5,dataRil:“10/06/21”,子类别:“FISH”},我期望[{data:[27,28,5],label:“FISH”},{data:[22,18,0],label:“DOG”},{data:[0,1,0],label:“CAT”},{data:[0,1,0],label:“BIRD”}但是我有:[{data:[27,28,5],label:“FISH”},{data:[0,22,18],label:“DOG”},{data:[0,0,1],label:“CAT”},{data:[0,0,1],label:“BIRD”}我想你需要看看逻辑,想想它在实践中应该如何工作,然后再问一次问题。我不明白你如何从逻辑上得到输出