【问题标题】:Nested "for" loops for oppositely nested data用于相反嵌套数据的嵌套“for”循环
【发布时间】:2016-10-04 21:12:14
【问题描述】:

对于我的问题令人困惑的标题,我深表歉意。不知道我需要什么。

我的目标是不要多次访问我的数据库。所以,我试图从我已经得到的变量中获取一切可能。

我的数据结构类似于以下:

reportData = [
    {
        date: '08/01/16',
        data: [
            {
                product: 'orange',
                picked: 20,
                washed: 15,
                sold: 11
            },{
                product: 'lemon',
                picked: 45,
                washed: 38,
                sold: 22
            },{
                product: 'apple',
                picked: 36,
                washed: 33,
                sold: 29
            }
        ]
    },{
        date: '08/02/16',
        data: [
            {
                product: 'orange',
                picked: 53,
                washed: 45,
                sold: 41
            },{
                product: 'lemon',
                picked: 44,
                washed: 31,
                sold: 21
            },{
                product: 'apple',
                picked: 76,
                washed: 55,
                sold: 45
            }
        ]
    }
]

等等……

我需要得到以下内容:

totalPicksByDate = [
    {
         date: '08/01/06',
         picked: 101 //sum of all the picked products
     },{
         date: '08/02/16',
         picked: 173
     }
]

totalPicksByProduct = [
    {
         product: 'orange',
         picked: 73 //sum of all the picked oranges
     },{
         product: 'lemon',
         picked: 99
     },{
         product: 'apple',
         picked: 112
     }
]

对于 totalPicksByDate 我有一个嵌套的“for”循环(这部分很简单):

for (var i=0; i < reportData.length; i++) { 
    for (var k=0; k < reportData[i].data.length; k++) { 
        //calculating totalPicksByDate here
    };
};

我的问题: 有没有一种聪明有效的方法可以从这个数据结构中获取 totalPicksByProduct(它就像嵌套的“for”循环,但由内而外)或者我应该再次访问我的数据库并重组reportData 变量?或者,也许我做的一切都错了……

【问题讨论】:

  • 你有没有想到一种特定的编程语言?您可能需要添加适当的标签,以吸引可以回答的适当人员的目光:)。如果这是 JavaScript,您可能会发现 this question 就是您想要的。
  • 是的,我正在使用 JavaScript,感谢您的提示,我将添加标签。并感谢您的链接!!!这让我的目标更加明确!
  • @nysmoon,您可以简单地对两个所需数据使用相同的循环,避免额外的步骤

标签: javascript for-loop data-structures


【解决方案1】:

totalPicksByDate 可以如下计算:

    var totalPicksByDate = $.map(reportData, function (item, index) {
        var total = { date: item.date, picked: 0 };
        $.each(item.data, function (idx, product) {
            total.picked += product.picked;
        });
        return total;
    });

totalPicksByProduct 稍微复杂一点:

    var totalPicksByProduct = [];
    var temp = {};
    $.each(reportData, function (index, item) {
        $.each(item.data, function (idx, product) {
            temp[product.product] = temp[product.product] || 0;
            temp[product.product] += product.picked;
        });
    });
    for(var name in temp)
    {
        totalPicksByProduct.push({ product: name, picked: temp[name] });
    }

【讨论】:

  • 是的!这很漂亮,就像一个魅力!非常感谢您的帮助:)
【解决方案2】:

你可以试试这个代码 sn-p 使用循环:

var reportData = [{
    date: "08/01/16",
    data: [{
      product: "orange",
      picked: 20,
      washed: 15,
      sold: 11
    }, {
      product: "lemon",
      picked: 45,
      washed: 38,
      sold: 22
    }, {
      product: "apple",
      picked: 36,
      washed: 33,
      sold: 29
    }]
  }, {
    date: "08/02/16",
    data: [{
      product: "orange",
      picked: 53,
      washed: 45,
      sold: 41
    }, {
      product: "lemon",
      picked: 44,
      washed: 31,
      sold: 21
    }, {
      product: "apple",
      picked: 76,
      washed: 55,
      sold: 45
    }]
  }],
  totalPicksByDate = [],
  totalPicksByProduct = [],
  l = reportData.length,
  report, item, j, data, sum, k, temp, found;
while (report = reportData[--l]) { //note assignment
  data = report.data;
  j = data.length;
  sum = 0;//sum of all picked items by date
  while (item = data[--j]) {
    sum += item.picked;
    k = totalPicksByProduct.length;
    found = false;
    while (temp = totalPicksByProduct[--k]) { //here we pick items by product name
      if (found = (temp.product === item.product)) {
        temp.picked += item.picked;//found in list, so update
        break;
      }
    }
    if (!found) {//item isn't in the list, so add new
      totalPicksByProduct.unshift({
        'product': item.product,
        'picked': item.picked
      });
    }
  }
  
  totalPicksByDate.unshift({
    'date': report.date,
    'picked': sum
  });
}
document.write('<pre>totalPicksByDate=' + JSON.stringify(totalPicksByDate, 0, 4) +'<br/>totalPicksByProduct='+ JSON.stringify(totalPicksByProduct, 0, 4) + '</pre>');

您也可以尝试使用 Array.forEach():

var reportData = [{
    date: "08/01/16",
    data: [{
      product: "orange",
      picked: 20,
      washed: 15,
      sold: 11
    }, {
      product: "lemon",
      picked: 45,
      washed: 38,
      sold: 22
    }, {
      product: "apple",
      picked: 36,
      washed: 33,
      sold: 29
    }]
  }, {
    date: "08/02/16",
    data: [{
      product: "orange",
      picked: 53,
      washed: 45,
      sold: 41
    }, {
      product: "lemon",
      picked: 44,
      washed: 31,
      sold: 21
    }, {
      product: "apple",
      picked: 76,
      washed: 55,
      sold: 45
    }]
  }],
  totalPicksByDate = [],
  totalPicksByProduct = [],
  sumByDate, foundByProduct;
reportData.forEach(function(report) {
  sumByDate = 0;
  report.data.forEach(function(data) {
    sumByDate += data.picked;
    foundByProduct = false;
    totalPicksByProduct.forEach(function(temp) {
      if (temp.product == data.product) {
        temp.picked += data.picked;
        foundByProduct = true;
      }
    });
    if (!foundByProduct) {
      totalPicksByProduct.push({
        'product': data.product,
        'picked': data.picked
      });
    }
  });
  totalPicksByDate.push({
    'date': report.date,
    'picked': sumByDate
  });
});
document.write('<pre>totalPicksByDate=' + JSON.stringify(totalPicksByDate, 0, 4) +'<br/>totalPicksByProduct='+ JSON.stringify(totalPicksByProduct, 0, 4) + '</pre>');

【讨论】:

  • Arvind,感谢您的帮助!这是我正在考虑做的事情,我的大脑无法想出正确的循环结构)))显然,还有另一种方法可以通过“映射”获取我想要的数据,如@BobDust 的帖子 :) 谢谢你又来了!
  • @nysmoon,别担心,我没有给出 jquery 解决方案只是因为你的帖子没有那个标签
  • 有道理!我的坏:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-28
  • 1970-01-01
  • 2019-12-17
相关资源
最近更新 更多