【问题标题】:JavaScript: Array.push() vs. Literal (Bracket) NotationJavaScript:Array.push() 与文字(括号)表示法
【发布时间】:2020-03-18 17:59:49
【问题描述】:

我指的是this answer

为什么 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;
}, []);

【问题讨论】:

    标签: javascript arrays


    【解决方案1】:

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

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

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

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

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

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

    这实际上就是 push 所做的。

    【讨论】:

    • 谢谢!我需要使用变量值(例如e.getTitle().substr(0, e.getTitle().indexOf('something')))作为键。如何做到这一点?
    • @Ben - Like this。 :-)
    【解决方案2】:

    第一个示例代码使用 push,它正在向数组 ar 添加一个对象。

    使用括号表示法的第二个示例代码,它正在更改对象 ar 中的值。

    【讨论】:

      【解决方案3】:

      在第一个示例中,reduce 函数将数据推送到聚合数组中。

      ar.push({...})
      

      在第二个示例中,聚合将数组上的值设置为键,JS 中为 arrays === objects

      ar['key-name'] = whatever
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-24
        相关资源
        最近更新 更多