我的数据数组如下:
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'],...]
请告诉我这有什么问题吗?
答案 0 :(得分:1)
您可以使用Array.prototype.map
将totalDays
数组映射到相应的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; })