Javascript 使用包含多个对象的单个索引遍历数组
我有一些数据看起来像这样Javascript 使用包含多个对象的单个索引遍历数组,javascript,arrays,json,object,Javascript,Arrays,Json,Object,我有一些数据看起来像这样 let arr = [ { a:1, b:2, c:3 }, { a:4, b:5, c:6 }, { a:7, b:8, c:9 } ] { a: [1,4,7], b: [2,5,8], c: [3,6,9] } 我想把它改成这样 let arr = [ { a:1, b:2, c:3 }, { a:4,
let arr = [
{
a:1,
b:2,
c:3
},
{
a:4,
b:5,
c:6
},
{
a:7,
b:8,
c:9
}
]
{
a: [1,4,7],
b: [2,5,8],
c: [3,6,9]
}
我想把它改成这样
let arr = [
{
a:1,
b:2,
c:3
},
{
a:4,
b:5,
c:6
},
{
a:7,
b:8,
c:9
}
]
{
a: [1,4,7],
b: [2,5,8],
c: [3,6,9]
}
以下是我的解决方案:
let arr = [
{
a:1,
b:2,
c:3
},
{
a:4,
b:5,
c:6
},
{
a:7,
b:8,
c:9
}
]
// {
// a: [1,4,7],
// b: [2,5,8],
// c: [3,6,9]
// }
function practice (arr) {
console.log(typeof arr) // WHY IS THIS RETURNING AN OBJECT???
let keys = Object.keys(arr[0])
const resultObj = {}
for (let key of keys) {
resultObj[key] = []
}
arr.forEach((x,idx)=> {
for (let key in x) {
resultObj[key].push(x[key])
}
})
return resultObj
}
practice(arr)
我知道我的解决方案不是最有效的方法。当我完成练习时,我很难理解以下概念:
乍一看,arr对我来说就像是一个只有一个索引的数组
包含三个对象的。例如,arr[0]={obj1}、{obj2}、{obj3},但是
我对arr执行了一次typeof检查,它返回了object。
当我在指定的索引arr[1]处控制台log arr时,它打印出{a:4,b:5,c:6},就像它是一个数组一样。
我的问题是这里发生了什么,这种类型的数据结构到底是什么?
请为我提供一个更简洁高效的代码,并向我解释概念。试试看
function practice (arr) {
let resultObj = {};
arr.forEach((x) => {
for (let key in x) {
if (resultObj.hasOwnProperty(key)) {
resultObj[key].push(x[key]);
} else {
resultObj[key] = [x[key]];
}
}
});
return resultObj;
}
试一试
为了检查数组,应该使用array.isArray方法。typeof将为您提供一个对象,因为数组本质上是使用对象构造函数创建的javascript中对象的一种形式 要获得所需的输出,只需在数组上循环并将值存储在对象中 设arr=[ { 答:1,, b:2, c:3 }, { a:4, b:5, c:6 }, { a:7, b:8, c:9 } ] var res={}; arr.forEachobj=>{ Object.entriesobj.forEach[key,val]=>{ ifres[键]{ res[key].pushval; }否则{ res[key]=[val]; } } };
console.logres 为了检查数组,应该使用array.isArray方法。typeof将为您提供一个对象,因为数组本质上是使用对象构造函数创建的javascript中对象的一种形式 要获得所需的输出,只需在数组上循环并将值存储在对象中 设arr=[ { 答:1,, b:2, c:3 }, { a:4, b:5, c:6 }, { a:7, b:8, c:9 } ] var res={}; arr.forEachobj=>{ Object.entriesobj.forEach[key,val]=>{ ifres[键]{ res[key].pushval; }否则{ res[key]=[val]; } } }; console.logres 您可以使用数组方法进行以下操作: 在reduce方法中使用object.keyso遍历数组中每个对象的所有键 在循环内,使用与循环内相同的键初始化累加器,该键的初始值为空数组[]。 然后使用r[k].pusho[k],我们在这个数组中添加匹配的键值。 然后最后从.reduce方法返回对象r。 设arr=[{a:1,b:2,c:3},{a:4,b:5,c:6},{a:7,b:8,c:9}]; 常数res=arr.reducer,o=>{ Object.keyso.forEachk=>{ r[k]=r[k]| |[]; r[k].普索[k] }; 返回r; }, {} 控制台。logres .作为控制台包装器{max height:100%!important;top:0;}您可以使用数组方法来处理以下内容: 在reduce方法中使用object.keyso遍历数组中每个对象的所有键 在循环内,使用与循环内相同的键初始化累加器,该键的初始值为空数组[]。 然后使用r[k].pusho[k],我们在这个数组中添加匹配的键值。 然后最后从.reduce方法返回对象r。 设arr=[{a:1,b:2,c:3},{a:4,b:5,c:6},{a:7,b:8,c:9}]; 常数res=arr.reducer,o=>{ Object.keyso.forEachk=>{ r[k]=r[k]| |[]; r[k].普索[k] }; 返回r; }, {} 控制台。logres .作为控制台包装器{max height:100%!important;top:0;}您可以尝试以下方法- 设arr=[ { 答:1,, b:2, c:3 }, { a:4, b:5, c:6 }, { a:7, b:8, c:9 } ]; 设res={}; Object.valuesarr.forEachvalue=>{ Object.keysvalue.forEachkey=>{ 如果res[key]的类型=='未定义'{ res[key]=[]; } res[key].pushvalue[key] } } console.logres 你可以试试这个- 设arr=[ { 答:1,, b:2, c:3 }, { a:4, b:5, c:6 }, { a:7, b:8, c:9 } ]; 设res={}; Object.valuesarr.forEachvalue=>{ Object.keysvalue.forEachkey=>{ 如果res[key]的类型=='未定义'{ res[key]=[]; } res[key].pushvalue[key] } } console.logres 使用多个forEach循环构建一个对象,其中键和值合并为同一个键 设arr=[ { 答:1,, b:2, c:3 }, { a:4, b:5, c:6 }, { a:7, b:8, c:9 } ]; 常数res={}; arr.forEachitem=>{ Object.keysitem.forEach key=>res[key]=key-in-res?[…res[key],item[key]]:[item[key]] ; }; console.logres 使用多个forEach循环构建一个对象,其中键和值合并为同一个键 设arr=[ { 答:1,, b:2, c:3 }, { a:4, b:5, c:6 }, { a:7, b:8, c:9 } ]; 常数res={}; arr.forEachitem=>{ Object.keysitem.forEach key=>res[key]=key-in-res?[…res[key],item[key]]:[item[key]] ; }; console.logres;邮递
您的代码在此处,而不是其他位置。对于数组检查,您应该使用array.isArray将代码发布在此处,而不是其他位置。对于数组检查,您应该使用array.isArray