繁体   English   中英

如何根据嵌套数组元素对对象进行排序

[英]How to sort object according to nested array elements

我需要按最早创建的帐户对主要数据进行排序。 在下面的示例中,列表中的第一个元素将是 id = 2。这是因为 id = 2 包含最早创建的帐户(名为 account3,创建于 2020 年 10 月 5 日,而其他帐户是在此之后创建的)那个日期)。 我正在使用 nodejs。 有没有es-function可以简单地解决这个问题?

对象数据如下所示:

 { "data": [{ "id": 1, "accounts": [{ "id": 333, "data": { "name": "account1", "createdAt": "2020-10-07T09:27:28.032Z" } }] }, { "id": 2, "accounts": [{ "id": 334, "data": { "name": "account2", "createdAt": "2020-10-06T09:27:28.032Z" } }, { "id": 335, "data": { "name": "account3", "createdAt": "2020-10-05T09:27:28.032Z" } }] }] }

您通常可以使用map --> sort --> map来解决这个问题。 它对输入进行了 3 次传递,但仍然是O(n log n) 您可以进一步优化,但我怀疑这会成为瓶颈。

  1. 映射到[record, oldestAccountDate]元组。

  2. oldestAccountDate对元组进行oldestAccountDate

  3. 再次映射以打开记录。

 const wrapper = { "data": [{ "id": 1, "accounts": [{ "id": 333, "data": { "name": "account1", "createdAt": "2020-10-07T09:27:28.032Z" } }] }, { "id": 2, "accounts": [{ "id": 334, "data": { "name": "account2", "createdAt": "2020-10-06T09:27:28.032Z" } }, { "id": 335, "data": { "name": "account3", "createdAt": "2020-10-05T09:27:28.032Z" } }] }] }; wrapper.data = wrapper.data .map(rec => [rec, Math.min(...rec.accounts.map(acc => new Date(acc.data.createdAt)))]) .sort((a, b) => a[1] - b[1]) .map(tuple => tuple[0]); console.log(wrapper);

 const data = [{ "id": 1, "accounts": [{ "id": 333, "data": { "name": "account1", "createdAt": "2020-10-07T09:27:28.032Z" } }] }, { "id": 2, "accounts": [{ "id": 334, "data": { "name": "account2", "createdAt": "2020-10-06T09:27:28.032Z" } }, { "id": 335, "data": { "name": "account3", "createdAt": "2020-10-05T09:27:28.032Z" } }] }] const sorted = data.sort((a, b) => { const aOldestDate = a.accounts.reduce((acc, item) => { const itemDate = new Date(item.data.createdAt); return itemDate < acc && itemDate || acc; }, new Date()); const bOldestDate = b.accounts.reduce((acc, item) => { const itemDate = new Date(item.data.createdAt); return itemDate < acc && itemDate || acc; }, new Date()); return aOldestDate - bOldestDate; }); console.log(sorted);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM