首页 > 解决方案 > 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;
}, []);

标签: javascriptarrays

解决方案


ar.push({/*...*/})创建一个对象并将该对象推入数组。

ar['eventTitle'] = e.getTitle();并使用这些名称在数组上创建属性(每次都覆盖以前的值)。他们不会将条目放入数组中。

push如果您的目标是将对象放入数组中,则版本是正确的。

在数组上具有任意属性可能看起来很奇怪,但标准数组是对象,因此您可以向它们添加属性。

如果你想通过赋值添加到数组中,你可以这样做:

ar[ar.length] = {eventTitle: e.getTitle(), eventId: id, startDate: e.getAllDayStartDate(), endDate: e.getAllDayEndDate()};

这就是有效的push


推荐阅读