嵌套的for循环总是显示最后的数据

Nested for loop always showing the last data

本文关键字:显示 最后的 数据 for 循环 嵌套      更新时间:2023-09-26

我有一个javascript代码:

var outerSet = [{date: '2016-12-12:00', value: 50}, {date: '2016-12-13:00', value: 50},
                {date: '2016-12-14:00', value: 70}, {date: '2016-12-15:00', value: 50}];
    
var hourlyData = ['2016-12-13:01','2016-12-13:02','2016-12-13:03',
                  '2016-12-13:04','2016-12-13:05']
var iterator = 0;
var tempData = [];
for (var i = 0; i < outerSet.length; i++) {
  var innerItem = outerSet[i];
  if (innerItem.date === '2016-12-13:00') {
    for (var j = 0; j < 4; j++) {
      tempData[iterator] = innerItem;
      tempData[iterator].date = hourlyData[j];
      iterator++;
    }
  }
}
console.log('temp data', tempData);

我想让新的tempData数组的日期值具有像

这样的值
[{date: '2016-12-12:01', value: 50},
 {date: '2016-12-13:02', value: 50},
 {date: '2016-12-14:03', value: 70},
 {date: '2016-12-15:04', value: 50}];

但是它总是返回

[{date: '2016-12-12:04', value: 50},
 {date: '2016-12-13:04', value: 50},
 {date: '2016-12-14:04', value: 70},
 {date: '2016-12-15:04', value: 50}];

这可能是一个关闭问题,但我无法找出问题所在。

这里是相同的小提琴:https://jsfiddle.net/nck66sre/

问题在这一行:

tempData[iterator] = innerItem;

在每次迭代中,将当前的tempData数组元素赋值为相同的对象。因此,当循环结束时,数组中的所有四个元素都引用同一个对象。(所以实际上你的代码并没有输出你所说的。)

您需要在每次迭代中创建一个新对象:

tempData[iterator] = { date: hourlyData[j], value: innerItem.value };
在上下文:

var outerSet = [{date: '2016-12-12:00', value: 50}, {date: '2016-12-13:00', value: 50},
                {date: '2016-12-14:00', value: 70}, {date: '2016-12-15:00', value: 50}];
    
var hourlyData = ['2016-12-13:01','2016-12-13:02','2016-12-13:03',
                  '2016-12-13:04','2016-12-13:05']
var tempData = [];
for (var i = 0; i < outerSet.length; i++) {
  var innerItem = outerSet[i];
  if (innerItem.date === '2016-12-13:00') {
    for (var j = 0; j < 4; j++) {
      tempData.push({ date: hourlyData[j], value: innerItem.value });
    }
  }
}
console.log('temp data', tempData);

(注意:我已经使用了.push()并删除了iterator变量,但这只是通过整理的方式,它与您的问题无关。)

您需要根据您想要获得的内容更改条件。请参考此代码。

     var outerSet = [{date: '2016-12-12:00', value: 50}, {date: '2016-12-13:00', value: 50},{date: '2016-12-14:00', value: 70},{date: '2016-12-15:00', value: 50}];
     var hourlyData = ['2016-12-13:01','2016-12-13:02','2016-12-13:03','2016-12-13:04','2016-12-13:05']
      var iterator = 0;
      var tempData = [];
      for (var i=0; i<outerSet.length; i++) {
        var innerItem =  outerSet[i];
        for (var j = 0; j < 4; j++) {
             if (innerItem.date === '2016-12-13:00') {
                tempData[iterator] = innerItem;
                tempData[iterator].date = hourlyData[j];
                iterator++;
            }
        }
      }
      console.log('temp data', tempData);
var outerSet = [{date: '2016-12-12:00', value: 50}, {date: '2016-12-13:00', value: 50},{date: '2016-12-14:00', value: 70},{date: '2016-12-15:00', value: 50}];
var hourlyData = ['2016-12-13:01','2016-12-13:02','2016-12-13:03','2016-12-13:04','2016-12-13:05']
      var iterator = 0;
      var tempData = [];
      for (var i=0; i<outerSet.length; i++) {
        var innerItem =  outerSet[i];
        if (innerItem.date === '2016-12-13:00') {
          for (var j = 0; j < 4; j++) {
             //remember object get value by refference and you need create new object then add value for object property
              tempData[iterator] = {};
              tempData[iterator].value = innerItem.value;
              tempData[iterator].date = hourlyData[j];
              iterator++;
          }
        }
      }
      console.log(JSON.stringify(tempData));

英文翻译:所有指针都指向同一个对象

function createNew(date,value){
    var obj ={
        "date":date,
        "value":value
    };
    return obj;
}
var outerSet = [{date: '2016-12-12:00', value: 40}, {date: '2016-12-13:00', value: 50},{date: '2016-12-14:00', value: 70},{date: '2016-12-15:00', value: 60}];
var hourlyData = ['2016-12-13:10','2016-12-13:20','2016-12-13:30','2016-12-13:40','2016-12-13:50'];
var tempData = new Array();
for (var i=0; i<outerSet.length; i++) {
    var innerItem =  outerSet[i];
    if (innerItem.date == '2016-12-13:00') {
        for (var j = 0; j < 4; j++) {
            var tempOuter=createNew(hourlyData[j],innerItem.value);
            tempData.push(tempOuter);
        }
    }
}
console.log('temp data', tempData);