循环遍历多个对象,在新对象中获取相似的键值



嗨,我有一个对象数组,我试图遍历它们,并在新对象中具有相似的键值,这是我拥有的数据示例。

let newDats = [{"ID":1, "Name": "Ahmed", "Age":17, "Score":84, "Absentee":3}, 
{"ID":2, "Name": "Hassan", "Age":15, "Score":87, "Absentee":2},
{"ID":3, "Name": "Aisha", "Age":18, "Score":86, "Absentee":2}]

以此类推。然而,我想要的东西是:

data = [{ID:[1,2,3], Names:["Ahmed", "Hassan","Aisha"], 
Ages:[17,15,18]}]

等等。我的最终目标是对数据的数字部分执行基本的描述性统计,所以如果有更好的想法,我很乐意听到我是js的新手。

p>

名(对象键)可以超过这个和未知的,所以我想要一些动态的

提前感谢。

您可以使用下面的函数。只需传递您想要排序的array

function dataSorter(dataArr) {
const data = {};
for (const item in dataArr[0]) data[item] = [];
for (let i = 0; i < dataArr.length; i++) {
for (const item in dataArr[i]) {
data[item].push(dataArr[i][item]);
}
}
return data;
}
/* Example Below */
let newDats = [{
ID: 1,
Name: "Ahmed",
Age: 17,
Score: 84,
Absentee: 3
},
{
ID: 2,
Name: "Hassan",
Age: 15,
Score: 87,
Absentee: 2
},
{
ID: 3,
Name: "Aisha",
Age: 18,
Score: 86,
Absentee: 2
},
];
console.log(dataSorter(newDats));
.as-console-wrapper { max-height: 100% !important; top: 0; } /* Ignore this */

类似于

let newDats = [{"ID":1, "Name": "Ahmed", "Age":17, "Score":84, "Absentee":3}, 
{"ID":2, "Name": "Hassan", "Age":15, "Score":87, "Absentee":2},
{"ID":3, "Name": "Aisha", "Age":18, "Score":86, "Absentee":2}];
data = {};
keys = [];
for(let keyVal in newDats[0]) {
keys.push(keyVal)
data[keyVal] = [];
}
newDats.forEach(dt => {
keys.forEach( kv => {
data[kv].push(dt[kv])
})
})
console.log(data)

您可以简单地reduce()对象数组,遍历每个元素的所有Object.keys()并将它们压入累加器的属性数组。这允许每个对象有不同的键。

let newDats = [{ "ID": 1, "Name": "Ahmed", "Age": 17, "Score": 84, "Absentee": 3 }, { "ID": 2, "Name": "Hassan", "Age": 15, "Score": 87, "Absentee": 2 }, { "ID": 3, "Name": "Aisha", "Age": 18, "Score": 86, "Absentee": 2 }];
const result = newDats.reduce((acc, o) => (
Object.keys(o).forEach(k => (acc[k] ??= []).push(o[k])), acc), {});
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

注意逻辑空赋值操作符(??=)的使用,为了兼容,可以用逻辑或短路代替。

//acc[k] ??= []
acc[k] = acc[k] || []

最新更新