在javascript中迭代多个数组

时间:2015-07-09 08:24:25

标签: javascript arrays

我的数据数组如下:

 totalDays = ["mon", "tue", "wed", "thu", "fri", "sat", "sun"],
 saleDays =  ["tue", "thu"],
 sale = [314,240].

我需要以这样一种方式修改'sale'数组,销售数组应该与totalDays数组相比具有相应的saleDays,如果当天销售包括销售数组金额,则包括销售数组中的0。

对于上面的例子我需要销售数组输出如下:

sale  = [0,314,0,240,0,0,0].

代码:

 var arr = _.zip(saleDays, sale);
    var newSale = [];
    var saleAmt = 0;
    _.forEach(arr, function(element) {
        saleAmt = totalDays.indexOf(element[0]) > -1 ? element[1] : 0;
        newSale.push(saleAmt); 
    });

但问题是在这种情况下indexOf条件总是返回true,所以我试图使用嵌套循环:

    _.forEach(totalDays, function(dt) {
        _.forEach(arr, function(element) {
        saleAmt = dt === element[0] ? element[1] : 0;
        newSale.push(saleAmt); 
        });
    });

但在这种情况下,循环运行'm * n'次。其中m是'totalDays'的长度,'n'是'arr'的长度。我想避免和循环应该运行totalDays.length次并生成结果。请帮助我实现欲望输出。

根据@Tao P. R.建议,同样的事情我试图用月销售周数开始。

例如:

totalSale = ['Wed Jun 10 2015','Tue Jun 16 2015','Mon Jun 22 2015','Sun Jun 28 2015','Sat Jul 04 2015','Fri Jul 10 2015']
saleDays: [ 'Mon Jun 15 2015', 'Tue Jul 07 2015' ]
sale: [134,245]

现在我必须检查总销售的哪一周,销售已经完成。对于上面我需要的例子 saleData = [134,0,0,0,245,0] 我通过为totalSale创建数组数组来尝试这个,

var mappedSale = _.map(totalDays, function(d){ 
    for(var j = 0; j < saleDays.length; j ++ ){
        var i = d.indexOf(saleDays[j]);
            if (i<0){ return 0 }
            else return sale[i];
    }
});

其中,

totalDays = [['Wed Jun 10 2015',..'Mon Jun 15 2015'],['Tue Jun 16 2015',..'Sun Jun 21 2015'],...]

请告诉我这有什么问题吗?

3 个答案:

答案 0 :(得分:1)

您可以使用Array.prototype.maptotalDays数组映射到相应的sale值,如下所示:

 totalDays = ["mon", "tue", "wed", "thu", "fri", "sat", "sun"],
 saleDays =  ["tue", "thu"],
 sale = [314,240];

// Output
var mappedSale = totalDays.map(function(d){
    var i = saleDays.indexOf(d);
    if (i<0){ return 0 }
    else return sale[i];
});

alert(mappedSale); // <-- [0,314,0,240,0,0,0]

下划线的等效逻辑

var mappedSale = _.map(totalDays, function(d){
    var i = saleDays.indexOf(d);
    if (i<0){ return 0 }
    else return sale[i];
});

答案 1 :(得分:0)

您可以在没有任何外部库的情况下尝试此操作:

var totalDays = ["mon", "tue", "wed", "thu", "fri", "sat", "sun"],
  saleDays = ["tue", "thu"],
  sale = [314, 240],
  newSales = [],
  i = -1,
  l = totalDays.length,
  j;
while (l > ++i) {
  j = saleDays.indexOf(totalDays[i]);
  newSales.push((-1 === j) ? 0 : sale[j]);
}
console.log(newSales);

使用.map()

var totalDays = ["mon", "tue", "wed", "thu", "fri", "sat", "sun"],
  saleDays = ["tue", "thu"],
  sale = [314, 240];
var s;
var newSales = totalDays.map(function(e) {
  s = saleDays.indexOf(e);
  return (-1 === s) ? 0 : sale[s];
});
console.log(newSales);

答案 2 :(得分:0)

其他答案没有任何问题,但是如果你做了一些准备,逻辑可能会更清楚,创建一个saleData对象如下:

var saleData = {};
for (var i = 0; i < sale.length; i++) { saleData[saleDays[i]] = sale[i]; }

这会给你一个对象

{ tue: 314, thu: 240 }

如果你正在使用下划线,你可以说

saleData = _.object(saleDays, saleData);

在任何一种情况下,现在map都更容易了:

totalDays . map(function(day) { return saleData[day] || 0; })