![](/img/trans.png)
[英]How to filter an array of objects based on whether the range between their date properties includes a given date?
[英]How to filter out array within array of objects based on date range?
我有一个对象数组,每个元素看起来像这样:
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);
}
}
});
};
它会删除一些提交对象,但不会删除正确的对象。 任何关于更好方法的建议将不胜感激。
对于过滤使用Array.filter
。 这将返回一个新数组,其中仅包含符合从callback
返回的boolean
的值。 要从现有的 arrays 创建新阵列,请使用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)
您可以将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)); }); };
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.