console.log返回[object Object]

时间:2019-01-05 13:00:14

标签: javascript

我从javascript开始,遇到这个问题,我试图返回数据并与数据进行数组排列,但是当我在控制台日志中得到“ [[object Object] [object Object]””

这是我必须处理的数据

var MARKDATA = {
 "SOR": {
   "mark": [
    {
     "data": {
       "2015": 21.680000,
       "2016": 23.739999,
       "2017": 23.760000
     },
     "markName": "swimming",
     "markCode": "SWM"
   },
   {
    "data": {
       "2015": "",
       "2016": 61.55429840,
       "2017": 61.482299804
     },
     "markName": "running (time)",
     "indicatorCode": "RM"
   }
  ]
 } 
};

这就是我尝试的

const valuesArr= MARKDATA.SOR.mark;

let acum= '';
const showData = arr => {
 const dataArr= arr.map(value => value.data).join('') 
 acum += dataArr;
};
showData(valuesArr);

console.log(acum)

我希望控制台日志返回并包含年份和对象数据的值的数组,我要做的是使用此数组通过reduce方法计算每个数据的平均值。

或者,如果有人知道一种更好的方法来获取对象数据的平均值,我将对其进行估算

1 个答案:

答案 0 :(得分:2)

您当前的代码正在显式地构建字符串:

  • 您使用字符串(acum)初始化''
  • 您根据join('')操作的结果调用map(创建一个字符串)

由于map正在创建对象数组,因此在taht数组上调用join会隐式在这些对象上调用toString。在这种情况下,没有特殊toString行为的对象将返回"[object Object]"

如果您想要一个data内容的数组,则需要在数组级别进行操作:

let acum = []; // <== An array
const showData = arr => {
    const dataArr= arr.map(value => value.data); // <== No join('')
    acum.push(...dataArr); // <== Appending to the array
};
showData(valuesArr);

console.log(acum);

这是最小的更改版本,但是没有理由创建那些临时数组(返回值map),也没有理由使用showData函数。只需使用for-of循环即可。您还可以包括解构。所以:

let acum = [];
for (const {data} of valuesArr) {
    acum.push(...data);
}

console.log(acum);

您可以将它塞入reduce中(因为您可以将任何数组操作塞入reduce中),但它不会为您带来任何好处:

let acum = valuesArr.reduce((a, {data}) => {
    a.push(...data);
    return a;
}, []);

console.log(acum);

或者(但这仍然毫无意义地创建了一个额外的数组),您可以使用proposal-but-still-Stage-3 Array.prototype.flat

let acum = valueArr.map(({data}) => data).flat();

console.log(acum);