Javascript jquery$。每个数组索引-1
如何使$。每个对象的索引为-1 因为obj[i-1]。一天不起作用Javascript jquery$。每个数组索引-1,javascript,jquery,Javascript,Jquery,如何使$。每个对象的索引为-1 因为obj[i-1]。一天不起作用 var签入状态=[{ “起始日期”:“2015-01-08”, “总天数”:“4”, “路线图”:[{ “礼物类型”:“星星”, “数量”:100, “天”:1 }, { “礼物类型”:“星星”, “数量”:500, “天”:3 }, { “礼物类型”:“星星”, “数量”:1000, “天”:10 }, { “礼物类型”:“星星”, “数量”:1200, “天”:20 }, { “礼物类型”:“星星”, “数量”:2200,
var签入状态=[{
“起始日期”:“2015-01-08”,
“总天数”:“4”,
“路线图”:[{
“礼物类型”:“星星”,
“数量”:100,
“天”:1
}, {
“礼物类型”:“星星”,
“数量”:500,
“天”:3
}, {
“礼物类型”:“星星”,
“数量”:1000,
“天”:10
}, {
“礼物类型”:“星星”,
“数量”:1200,
“天”:20
}, {
“礼物类型”:“星星”,
“数量”:2200,
“天”:30
}]
}];
var checkin_info=checkin_状态[0]。路线图;
$。每个(签入信息、功能(i、obj){
var sum_day=obj[i-1]。day+obj.day;
var中间日=总和日/2;
控制台日志(中天);
});代码>
特殊情况第一个条目,如下所示:
var checkin_status = [{
"startdate": "2015-01-08",
"totaldays": "4",
"roadmap": [{
"gifttype": "stars",
"quantity": 100,
"day": 1
}, {
"gifttype": "stars",
"quantity": 500,
"day": 3
}, {
"gifttype": "stars",
"quantity": 1000,
"day": 10
}, {
"gifttype": "stars",
"quantity": 1200,
"day": 20
}, {
"gifttype": "stars",
"quantity": 2200,
"day": 30
}]
}];
var checkin_info = checkin_status[0].roadmap;
$.each(checkin_info, function (i, obj)
{
var sum_day = 0;
if(i==0)
{
//this is the first entry, so we can't look back to the previous day.
sum_day = obj.day;
}
else
{
//you were calling obj[i-1] here, which wasn't going to work.
//i presume you wanted the previous day here.
sum_day = checkin_info[i - 1].day + obj.day;
}
var middle_day = sum_day / 2;
console.log(middle_day);
});
你根本不需要每个
在这里,你要把一个数组映射到另一个数组,我把它分成下面的两个操作来演示,但不需要。这一切都可以在一张地图上完成:
var签入状态=[{
“起始日期”:“2015-01-08”,
“总天数”:“4”,
“路线图”:[{
“礼物类型”:“星星”,
“数量”:100,
“天”:1
}, {
“礼物类型”:“星星”,
“数量”:500,
“天”:3
}, {
“礼物类型”:“星星”,
“数量”:1000,
“天”:10
}, {
“礼物类型”:“星星”,
“数量”:1200,
“天”:20
}, {
“礼物类型”:“星星”,
“数量”:2200,
“天”:30
}]
}];
var checkin_info=checkin_状态[0]。路线图;
var result1=checkin_info.slice(1,checkin_info.length).map(函数(e,i){
返回签入信息[i].day+e.day;
});
console.log(result1);//日志[4,13,30,50]
var result2=result1.map(函数(e){
返回e/2;
});
console.log(result2);//日志[2,6.5,15,50]
$。每个日志都不利于性能,因为每个交互都会调用函数。最好在vanilla js中使用for循环
var checkin_status = [
{"startdate":"2015-01-08",
"totaldays":"4",
"roadmap":[
{"gifttype":"stars","quantity":100,"day":1},
{"gifttype":"stars","quantity":500,"day":3},
{"gifttype":"stars","quantity":1000,"day":10},
{"gifttype":"stars","quantity":1200,"day":20},
{"gifttype":"stars","quantity":2200,"day":30},
]
}];
var checkin_info = checkin_status[0].roadmap,
len = checkin_info.length,
i,
sum_day = [],
middle_day = [],
sum = 0;
for(i=0; i< (len -1); i++) {
sum = checkin_info[i].day + checkin_info[i + 1].day;
sum_day.push(sum);
middle_day.push(sum/2);
}
console.log(sum_day)
console.log(middle_day)
var签入状态=[
{“开始日期”:“2015-01-08”,
“总天数”:“4”,
“路线图”:[
{“礼物类型”:“星星”,“数量”:100,“天”:1},
{“礼物类型”:“星星”,“数量”:500,“天”:3},
{“礼物类型”:“星星”,“数量”:1000,“天”:10},
{“礼物类型”:“星星”,“数量”:1200,“天”:20},
{“礼物类型”:“星星”,“数量”:2200,“天”:30},
]
}];
var checkin_info=checkin_状态[0]。路线图,
len=签入信息长度,
我
总天数=[],
中天=[],
总和=0;
对于(i=0;i<(len-1);i++){
总和=签入信息[i]。天+签入信息[i+1]。天;
sum_日推送(sum);
中午推送(总和/2);
}
控制台日志(总和日)
console.log(中天)
当它试图访问一个不存在的元素(在你的第一个项目之前没有项目)时,它会在你的第一个项目(“day”:1)上抛出一个错误。obj[i-1]。day
需要是签入信息[i-1]。day
并且你需要跳过第一个项目,它才能工作。@Jamiec使用签入信息[i-1].day
将获取无法读取未定义的属性“day”
为什么要尝试使用i
作为obj
的索引?obj
参数的值将与checkin_info[i]
相同。但是obj
是您正在迭代的当前元素(如roadmap
中的当前对象),它不能是数组。正如@nnnnnn刚才所说的!在$中还有其他方法吗?每个
?都注意到了这一点并更改了答案。$。每个循环的行为都不同于正常循环。如果返回true,它将停止处理当前迭代并继续下一个迭代。如果我更改为签入信息[I-1]。第一天的项目将被跳过。我不想第一项被跳过。help@ImHappy修好了。好眼力。此外,如果我们不跳过第一项,我们如何计算一天的中间时间?这没有提到前一天,因此如果我们不跳过第一天,我们就无法进行计算。嘿,这更整洁了。我必须在$中使用result2
。每个@ImHappy-为什么?你会用拖鞋钉钉子吗?正确的工具适合正确的工作(或者,这是家庭作业吗?@ImHappy那么您需要result2
中所有数字的总和是多少?如果不是,为什么不能在结果数组上迭代呢。这个答案完全符合你在问题中的两个要点中提出的要求——但比你想做的要简洁得多!现在你失去了我——这正是井,它起作用了。但是它背后的理由有点空洞。看,我们发现使用jquery的每个。它的开销非常小,以至于在这样的数据集上几乎看不到它。