筛选数组到事件的产品签入记录



我有一个活动提要,它包含我们网站的许多不同类型的活动。

一种类型的活动是签入。它记录用户签入和签出网站的时间。

记录条目如下所示

Entryable_id | Entry_type | Action | timestamp
   1             Ticket       Update    12:01
   3             Ticket       New       12:07
   4             CheckIn     ClockedIn  14:30
   4             CheckIn     ClockedOut 17:30

我想做的是创建一个包含条目的数组,如下所示

Entryable_id | ClockedIn| ClockedOut
    4            14:30      17:30

到目前为止,我所拥有的是

{
  let staffCheckins = []
  let checkinRecord = []

  if (this.DiaryStore.entries.length) {
    this.DiaryStore.entries.forEach(function(val) {
      if (val.entryable_type === 'CheckIn') {
        staffCheckins.push(val);
        return val
      }
    })
  }
  staffCheckins.forEach(function(val) {
    if (val.action === "ClockedIn") {
      checkinRecord[val.entryable_id] = {
        clockedIn: val.created_at,
        user: val.user
      }
    }

    if (val.action === "ClockedOut") {
      checkinRecord[val.entryable_id] = {
        clockedOut: val.created_at
      }
    }
  })

  console.log(completeCheckin)
},

这给了

1: clockedIn: "2019-07-22T10:26:45.000000Z",
2: clockedIn: "2019-07-22T12:38:02.000000Z"

所以我假设当我这样做时它不会附加到密钥

checkinRecord[val.entryable_id] =  {clockedOut: val.created_at}

最重要的是,这一切都感觉一团糟。 有没有更好的方法来过滤和获取我需要的东西?

谢谢

您需要合并属性,而不是分配给新对象

  staffCheckins.forEach(function(val) {
    if (!checkinRecord[val.entryable_id]) {
      checkinRecord[val.entryable_id] = {}
    }
    if (val.action === "ClockedIn") {
      checkinRecord[val.entryable_id] = {
        ...checkinRecord[val.entryable_id],
        clockedIn: val.created_at,
        user: val.user
      }
    } else (val.action === "ClockedOut") {
      checkinRecord[val.entryable_id] = {
          ...checkinRecord[val.entryable_id],
          clockedOut: val.created_at
      }
    }
  }
所以我

还没有测试它,因为我外出走动,但你可以尝试这样的事情。如果他们的对象entryable_id数组中的当前对象中不存在,那么它将创建一个带有成员的新对象,否则它将找到该对象并更新字段

{
    let staffCheckins = [];
    let checkinRecord = [];
    if (this.DiaryStore.entries.length) {
        staffCheckins = this.DiaryStore.filter(val => val.entryable_type.toLowerCase() === 'checkin');
    }
    staffCheckins.forEach(function(val, i) {
        let { action, entryable_id, created_at, user } = val;
        if (!entryable_id in checkinRecord[i]) {
            checkinRecord[i] = {
                clockedIn: created_at,
                clockedOut: created_at,
                user
            }
        }
        if (action.toLowerCase() === 'clockedin') {
            checkinRecord[i] = {
                ...checkinRecord[i],
                clockedIn: created_at,
                user
            }
        } else if (action.toLowerCase() === 'clockedout') {
            checkinRecord[i] = {
                ...checkinRecord[i],
                clockedOut: created_at
            }
        }
    });
}

抱歉,如果我理解错了,但我目前也没有在我的实际计算机上测试任何内容

您可以在过滤器reduce组合中执行整个操作,并使用Entryable_id作为键创建groupBy 对象。

循环完成后,获取该对象的值数组

const checkinGroup = data.filter(({Entry_type}) => Entry_type === 'CheckIn')
                .reduce((a, c)=>{
                    let {Entryable_id:id, Action, timestamp} = c;
                    a[id] = a[id] || {Entryable_id: id, ClockedIn: null, ClockedOut: null};
                    a[id][Action] = timestamp;
                    return a;                
                },{});
const res = Object.values(checkinGroup)
console.log(res)
<script>
  const data = [{
      Entryable_id: 1,
      Entry_type: 'Ticket',
      Action: 'Update',
      timestamp: '12:01'
    },
    {
      Entryable_id: 3,
      Entry_type: 'Ticket',
      Action: 'New',
      timestamp: '12:07'
    },
    {
      Entryable_id: 4,
      Entry_type: 'CheckIn',
      Action: 'ClockedIn',
      timestamp: '14:30'
    },
    {
      Entryable_id: 4,
      Entry_type: 'CheckIn',
      Action: 'ClockedOut',
      timestamp: '17:30'
    }
  ]
</script>

最新更新