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