【问题标题】:How to filter out array within array of objects based on date range?如何根据日期范围过滤掉对象数组中的数组?
【发布时间】:2019-11-20 02:55:34
【问题描述】:

我有一个对象数组,每个元素看起来像这样:

campaigns: (5) ["get.dentalintel.net/call-insight-DeshaunWatson", "get.dentalintel.net/practice-analysis-DeshaunWatson", "get.dentalintel.net/morning-huddle-DeshaunWatson", "get.dentalintel.net/new-morning-huddle-DeshaunWatson", "get.dentalintel.net/followups-DeshaunWatson"]
email: "dwats@gmail.com"
name: "Deshaun Watson"
submissions: [{…}]
user_id: 166

在每个元素中都有一个提交对象数组,如下所示:

campaigns: (5) ["get.dentalintel.net/call-insight-DeshaunWatson", "get.dentalintel.net/practice-analysis-DeshaunWatson", "get.dentalintel.net/morning-huddle-DeshaunWatson", "get.dentalintel.net/new-morning-huddle-DeshaunWatson", "get.dentalintel.net/followups-DeshaunWatson"]
email: "dwats@gmail.com"
name: "Deshaun Watson"
submissions: Array(1)
0:
addedAt: 1574185321138
canonical-vid: 13476551
form-submissions: []
identity-profiles: [{…}]
is-contact: true
merge-audits: []
merged-vids: []
portal-id: 2271480
profile-token: "AO_T-mOo4xVvqmFyVkiizX8l0pCPZTakJOfo02uTm2kWzr68fzpXI6-xmyh4Gmj_Pzpp8IBDdbEN9CCRW4GeMfybZaSBiMZ8xXo2U2dylZ7QD3CufR-ERrazbZlKPaDyVzxaCqwvXU3W"
profile-url: "https://app.hubspot.com/contacts/2271480/contact/13476551"
properties: {partner_email: {…}, utm_campaign: {…}, lastmodifieddate: {…}, partner_last_name: {…}, email: {…}}
vid: 13476551
__proto__: Object
length: 1
__proto__: Array(0)
user_id: 166

唯一需要注意的属性是 addedAt 值。 我想根据日期范围过滤掉提交对象。这是我到目前为止没有运气的尝试:


  filterByDate = () => {
    const { partners, endDate, startDate } = this.state;
    partners.forEach(partner => {
      for (let i = 0; i < partner.submissions.length; i++) {
        if (
          moment(partner.submissions[i].addedAt).isBetween(startDate, endDate)
        ) {
          return partners;
        } else {
          return partner.submissions.splice(i, 1);
        }
      }
    });
  };

它会删除一些提交对象,但不会删除正确的对象。任何关于更好方法的建议将不胜感激。

【问题讨论】:

标签: javascript reactjs momentjs


【解决方案1】:

过滤使用Array.filter。这将返回一个新数组,其中仅包含满足从callback 返回的boolean 的值。要从现有数组创建新数组,请使用 Array.map 而不是 Array.forEach。 forEach 循环仅迭代值,但Array.map 为每个元素返回修改后的值或新值。

const filterByDate = () => {
    const { partners, endDate, startDate } = this.state;
    const filteredPartners = partners.map(partner => {
        return {
            ...partner,
            submissions: partner.submissions.filter(submission =>
                moment(submission.addedAt).isBetween(startDate, endDate)
            )
        };
    });
};

示例 Array.filter 和 Array.map(无突变)

const testArray = [{
  id: 1
}, {
  id: 2
}, {
  id: 3
}, {
  id: 4
}]
const filtered = testArray.filter(e => e.id !== 3)
const mapped = testArray.map(e => {
  return {
    id: e.id,
    name: `Name of ${e.id}`
  }
})

console.log("Test Array: ", testArray)
console.log("Filtered Array: ", filtered)
console.log("Mapped Array: ", mapped)

【讨论】:

  • 这很棒。非常感谢您的解释。效果很好。
【解决方案2】:

您可以在此用例中使用Array.prototype.filter()

filterByDate = () => {
  const { partners, endDate, startDate } = this.state;
  partners.forEach(partner => {
    partner.submissions = partner.submissions.filter(sub =>  moment(partner.submissions[i].addedAt).isBetween(startDate, endDate));
  });
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-06
    • 2018-09-27
    • 2021-05-25
    • 2014-07-19
    • 1970-01-01
    • 2022-12-19
    • 2015-05-16
    • 2020-11-15
    相关资源
    最近更新 更多