Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 混乱,在嵌套对象上循环并执行特定计算_Javascript_Arrays_Foreach_Ecmascript 6 - Fatal编程技术网

Javascript 混乱,在嵌套对象上循环并执行特定计算

Javascript 混乱,在嵌套对象上循环并执行特定计算,javascript,arrays,foreach,ecmascript-6,Javascript,Arrays,Foreach,Ecmascript 6,我被卡住了!我有以下代码: const hours = [ { "workHour" : "8", "Item name 1" : 120, "Item name 2" : 149, "Item name 3" : 137 }, { "workHour" : "9", "Item name 1" : 134, "Item name 2" : 119,

我被卡住了!我有以下代码:

const hours = [
    {
        "workHour" : "8",
        "Item name 1" : 120,
        "Item name 2" : 149,
        "Item name 3" : 137
    },
    {
        "workHour" : "9",
        "Item name 1" : 134,
        "Item name 2" : 119,
        "Item name 3" : 144
    },
    {
        "workHour" : "10",
        "Item name 1" : 60,
        "Item name 2" : 86,
        "Item name 3" : 83
    },
];

const records = [
   { date: new Date(), statistics: hours },
   { date: new Date(), statistics: hours },
   { date: new Date(), statistics: hours },
];

const result = {};
result.chart = [];

records.forEach((record) => {
   const items = [];
   record.statistics.forEach((hour) => {
      for (let key in hour) {
         if (key !== 'workHour') {
           items.push({
              key: hour[key]
           })
         }
      }
   });
   result.chart.push({
      date: record.date,
      items
   });
});

console.log(result);
我要做的是循环记录数组中的每个项目,然后循环每个记录的小时数,将每个项目的所有值相加,就像计算所有小时数的总和一样,我要得到的结果是:

array = [
  { 
    date: //record date,
    "Item name 1" : 314,
    "Item name 2" : 354,
    "Item name 3" : 364
  },
  { 
    date: //record date,
    "Item name 1" : 314,
    "Item name 2" : 354,
    "Item name 3" : 364
  },
  { 
    date: //record date,
    "Item name 1" : 314,
    "Item name 2" : 354,
    "Item name 3" : 364
  }
];
已知小时项目键时的工作示例:

const hours = [
{
    "workHour" : "8",
    "Item name 1" : 120,
    "Item name 2" : 149,
    "Item name 3" : 137
},
{
    "workHour" : "9",
    "Item name 1" : 134,
    "Item name 2" : 119,
    "Item name 3" : 144
},
{
    "workHour" : "10",
    "Item name 1" : 60,
    "Item name 2" : 86,
    "Item name 3" : 83
},
])

印刷品:

records = [


{
      'Item name 1': 314,
      'Item name 2': 354,
      'Item name 3': 364,
   },
   {
      'Item name 1': 314,
      'Item name 2': 354,
      'Item name 3': 364,
   },
   {
      'Item name 1': 314,
      'Item name 2': 354,
      'Item name 3': 364,
   },
]

我相信这解决了你的要求,但我觉得还有更多。记录是否都具有相同的小时数

我知道这是一个有点密集,所以我添加了一些评论,我希望能阐明这是如何工作的

const hours=[
{“工时”:“8”,“项目名称1”:120,“项目名称2”:149,“项目名称3”:137},
{“工时”:“9”,“项目名称1”:134,“项目名称2”:119,“项目名称3”:144},
{“工时”:“10”,“项目名称1”:60,“项目名称2”:86,“项目名称3”:83}
];
常量记录=[
{date:new date(),statistics:hours},
{date:new date(),statistics:hours},
{date:new date(),统计信息:小时数}
];
// ========================
//使用map()
//对于每个“记录”,根据“记录”返回一个对象
// ========================
var result=records.map(函数(记录){
// ========================
//创建不依赖于的初始结果
//关于总结“统计”。
//
//我们将把它传递到reduce()中,它将是
//累加器的初始值
// ========================
var initialResult={date:record.date};
// ========================
// ========================
//使用reduce()
//关注有趣的工作项目
//总结时间
// ========================
var finalResult=record.statistics.reduce(函数(acc,项){
key(item)//项对象中的键数组
.filter(函数(键){return key!==“workHour”;})//删除此键
.forEach(函数(键){acc[key]=(acc[key]| | 0)+item[key]});//对于每个剩余键,将其值添加到运行总数中
// ========================
//返回运行总累加器,用于下一项
// ========================
返回acc;
// ========================
},初始结果);
// ========================
// ========================
//返回一个基于记录但包含reduce()中累积数据的对象
//此对象成为map()最终返回的数组中的一个项
// ========================
返回最终结果;
// ========================
});
// ========================

console.log(result)
如果正确解释问题,您可以用
代替
循环中的..代替
.forEach()
,使用计算属性名
[key]
设置推送到
项的对象的属性名

const hours=[{
“工时”:“8”,
“项目名称1”:120,
“项目名称2”:149,
“项目名称3”:137
}, {
“工时”:“9”,
“项目名称1”:134,
“项目名称2”:119,
“项目名称3”:144
}, {
“工时”:“10”,
“项目名称1”:60,
“项目名称2”:86,
“项目名称3”:83
}, ];
const records=hours.map((小时,索引)=>({
日期:新日期(),
统计:小时[索引]
}));
const result={};
result.chart=[];
记录。forEach((记录,索引)=>{
常量项=[];
对于(让[记录]的{statistics:hour}){
用于(输入小时数){
如果(键!=“工时”){
推({
[键]:小时[键]
+(结果.图表[索引-1]
&&result.chart[索引-1].hasOwnProperty(“项”)
?结果。图表[索引-1]。项目
.filter(obj=>obj.hasOwnProperty(键))[0][key]
: 0)          
})
}
}
};
结果。图表。推({
日期:record.date,
项目
});
});

控制台日志(结果)
您试图在
数组
?@guest271314的每个对象上设置相同的值。我试图在所有小时内循环,并且+=对不在后面的每个项目求和。预期结果
array
包含相同的对象?@guest271314在本例中,它们包含相同的结果,但结果来自按小时收集每个项目值。所以:记录->特定记录中的小时->小时->小时中的3项。根据小时对每个项目求和…这是
项目
数组对象的预期结果,该数组对象包含例如
{key:134}
?感谢您的帮助!JonSG得到了我想要的结果,但我完全不理解他的方法。。有什么简单的方法可以做到这一点吗?
javascript
at stacksnippets是否不会返回预期的结果?几乎,您的items数组包含额外的[][]两个数组,而不是直接的items->Item 1、Item 2、Item 3,比如@JonSG DidThank。。剩下的只有一件事是items数组需要将记录作为键保存在该项键值对中:items:[{“date”:“2016-11-11T21:32:47.533Z”,“item name 1”:314,“item name 2”:354,“item name 3”:364}]顺便说一句,如果()循环的性能提高了2倍,JonSG会这样回答。。我用console.time标记了两个ooptions..@JasonBrill我注意到在另一个回答中,您指出我的方法有点混乱。我添加了一些评论,希望能让事情更清楚一点。非常感谢!为了便于解释,我想知道有没有一种方法可以在不使用reduce的情况下实现这一点?我添加了一个不使用reduce()的版本,谢谢!你建议用reduce还是不加reduce?两者都可以。在本例中,forEach()看起来非常合理,甚至比reduce()更清晰。通常,reduce()可以清理混乱的forEach(),但在这种情况下,情况可能正好相反:-)
records = [


{
      'Item name 1': 314,
      'Item name 2': 354,
      'Item name 3': 364,
   },
   {
      'Item name 1': 314,
      'Item name 2': 354,
      'Item name 3': 364,
   },
   {
      'Item name 1': 314,
      'Item name 2': 354,
      'Item name 3': 364,
   },
]