javascript - JavaScript:Array.push() 与文字(括号)表示法
问题描述
我指的是这个答案。
为什么Code Snippet 2的返回值与Code Snippet 1不同?
代码片段 1:
var firstEvents = events.reduce(function(ar, e) {
var id = e.getId();
if (e.isRecurringEvent() && e.isAllDayEvent() && !ar.some(function(f) {return f.eventId == id})) {
ar.push({eventTitle: e.getTitle(), eventId: id, startDate: e.getAllDayStartDate(), endDate: e.getAllDayEndDate()});
}
return ar;
}, []);
代码片段 2:
var firstEvents = events.reduce(function(ar, e) {
var id = e.getId();
if (e.isRecurringEvent() && e.isAllDayEvent() && !ar.some(function(f) {return f.eventId == id})) {
ar['eventTitle'] = e.getTitle();
ar['eventId'] = id;
ar['startDate'] = e.getAllDayStartDate();
ar['endDate'] = e.getAllDayEndDate();
}
return ar;
}, []);
编辑:
为什么Code Snippet 3的行为符合预期(每个事件系列添加一个对象),而Code Snippet 4却没有?
代码片段 3:
var firstEvents = events.reduce(function(ar, e) {
var id = e.getId();
if (e.isRecurringEvent() && e.isAllDayEvent() && !ar.some(function(f) {return f.eventId == id})) {
ar.push({eventTitle: e.getTitle(), eventId: id});
}
return ar;
}, []);
代码片段 4:
var firstEvents = events.reduce(function(ar, e) {
var id = e.getId();
if (e.isRecurringEvent() && e.isAllDayEvent() && !ar.some(function(f) {return f.eventId == id})) {
ar.push({eventTitle: e.getTitle()});
}
return ar;
}, []);
解决方案
ar.push({/*...*/})
创建一个对象并将该对象推入数组。
ar['eventTitle'] = e.getTitle();
并使用这些名称在数组上创建属性(每次都覆盖以前的值)。他们不会将条目放入数组中。
push
如果您的目标是将对象放入数组中,则版本是正确的。
在数组上具有任意属性可能看起来很奇怪,但标准数组是对象,因此您可以向它们添加属性。
如果你想通过赋值添加到数组中,你可以这样做:
ar[ar.length] = {eventTitle: e.getTitle(), eventId: id, startDate: e.getAllDayStartDate(), endDate: e.getAllDayEndDate()};
这就是有效的push
。
推荐阅读
- postgresql - postgres的右连接返回意外结果
- javascript - 可以在字符串上使用 for in 循环吗?
- python - 日期是列,时间是行。我无法同步两者
- javascript - Vuex getter 反应性问题(结合 Vue 路由器)
- internet-explorer - ie 11 最新版本在屏幕后面打开弹幕
- html - 如何更改 pickerInput 元素的容器颜色?
- powerbi - 具有用户输入的 DAX PowerBI 平均值总和
- python - 我无法从 python 的标准库中加载模块
- php - 从 PHP 调用已编译的 C++ 可执行文件以创建套接字
- c# - 了解 debugDiag 报告