簡體   English   中英

如何在 JavaScript 中過濾和 map 陣列

[英]How to filter and map Array in JavaScript

原始數組中有幾個對象,每個對象都有三個屬性(時間戳、名稱和年齡)。

如果連續多個時間戳相隔 15 分鍾,它們將被分組到同一個 object 中。 之后,將添加一個名為 end 的新屬性,該屬性將是該組的最后一個元素的時間戳值加上 15 分鍾。

如果一行中沒有多個元素之間相差 15 分鍾,則 end 屬性將時間戳加上 15 分鍾作為值。

這是我當前的代碼:

 const data = [ { timestamp: '2021-11-23T14:15:00+0000', name: 'John', age: 25, }, { timestamp: '2021-11-23T14:30:00+0000', name: 'John', age: 25, }, { timestamp: '2021-11-23T14:45:00+0000', name: 'John', age: 25, }, { timestamp: '2021-11-23T15:45:00+0000', name: 'John', age: 25, }, { timestamp: '2021-11-23T14:15:00+0000', name: 'Anne', age: 32, }, { timestamp: '2021-11-23T14:30:00+0000', name: 'Anne', age: 32, }, { timestamp: '2021-11-23T14:45:00+0000', name: 'Anne', age: 32, }, { timestamp: '2021-11-23T15:45:00+0000', name: 'Anne', age: 32, }, ] const newArray = data.reduce((accumulator, current) => { const end = new Date(Date.parse(current.timestamp) + 15 * 60 * 1000) if (accumulator.length === 0) { accumulator.push({...current, end, }) } else { const last = accumulator[accumulator.length - 1] if (last.name === current.name && last.age === current.age) { last.end = end } else { accumulator.push({...current, end, }) } } return accumulator }, []) console.log(newArray)

然而,我的代碼的最終結果並不是我想要的。 我希望我的結果是這樣的:

[
    {
        timestamp: '2021-11-23T14:15:00+0000',
        name: 'John',
        age: 25,
        end: '2021-11-23T15:00:00+0000'
    },
    {
        timestamp: '2021-11-23T15:45:00+0000',
        name: 'John',
        age: 25,
        end: '2021-11-23T16:00:00+0000'
    },
    {
        timestamp: '2021-11-23T14:15:00+0000',
        name: 'Anne',
        age: 32,
        end: '2021-11-23T15:00:00+0000'
    },
    {
        timestamp: '2021-11-23T15:45:00+0000',
        name: 'Anne',
        age: 32,
        end: '2021-11-23T16:00:00+0000'
    }
]

如果找到,您可以搜索最后一個間隔並更新end 否則添加一個新的 object。

 const data = [{ timestamp: '2021-11-23T14:15:00+0000', name: 'John', age: 25 }, { timestamp: '2021-11-23T14:30:00+0000', name: 'John', age: 25 }, { timestamp: '2021-11-23T14:45:00+0000', name: 'John', age: 25 }, { timestamp: '2021-11-23T15:45:00+0000', name: 'John', age: 25 }, { timestamp: '2021-11-23T14:15:00+0000', name: 'Anne', age: 32 }, { timestamp: '2021-11-23T14:30:00+0000', name: 'Anne', age: 32 }, { timestamp: '2021-11-23T14:45:00+0000', name: 'Anne', age: 32 }, { timestamp: '2021-11-23T15:45:00+0000', name: 'Anne', age: 32 }] const newArray = data.reduce((accumulator, current) => { const end = new Date(Date.parse(current.timestamp) + 15 * 60 * 1000).toISOString(), item = accumulator.find(o => o.name === current.name && o.end === new Date(current.timestamp).toISOString() ); if (item) item.end = end; else accumulator.push({...current, end }); return accumulator; }, []) console.log(newArray);
 .as-console-wrapper { max-height: 100%;important: top; 0; }

您可以使用Array.reduce()來獲得所需的結果,就像在您自己的代碼中一樣,但我們可以稍作更改以更新累加器數組中的 lastItem,如果

  • 名稱相同(lastItem.name === name)
  • 日期在 15 分鍾內

如果不滿足這個條件,我們只需添加到累加器數組中。

 const data = [ { timestamp: '2021-11-23T14:15:00+0000', name: 'John', age: 25, }, { timestamp: '2021-11-23T14:30:00+0000', name: 'John', age: 25, }, { timestamp: '2021-11-23T14:45:00+0000', name: 'John', age: 25, }, { timestamp: '2021-11-23T15:45:00+0000', name: 'John', age: 25, }, { timestamp: '2021-11-23T14:15:00+0000', name: 'Anne', age: 32, }, { timestamp: '2021-11-23T14:30:00+0000', name: 'Anne', age: 32, }, { timestamp: '2021-11-23T14:45:00+0000', name: 'Anne', age: 32, }, { timestamp: '2021-11-23T15:45:00+0000', name: 'Anne', age: 32, }, ] const result = data.reduce((acc, { timestamp, name, age }) => { let lastItem = acc[acc.length - 1]; let end = new Date(Date.parse(timestamp) + 15*60*1000); // If the current row matches just update the end time if (lastItem && lastItem.name === name && (Date.parse(lastItem.end) - Date.parse(timestamp) >= 0)) { lastItem.end = end; } else { acc.push({ timestamp, name, age, end }); } return acc; }, []) console.log(result)
 .as-console-wrapper { max-height: 100%;important: top; 0; }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM