JavaScript-如何使用其他条件过滤重复的行

时间:2019-07-16 16:01:07

标签: javascript arrays ecmascript-6 filter

我想过滤具有1个条件的重复行

例如:

1)我的ID重复,但状态不同
2)如果状态为“已完成”,我想过滤重复的ID

var data = [
    {ID : 1,
    Status : 'Completed'},
    {ID : 1,
    Status : 'Fail'},
    {ID : 2,
    Status : 'Fail'},
    {ID : 2,
    Status : 'Completed'},
    {ID : 3,
    Status : 'Fail'},
    {ID : 4,
    Status : 'Completed'},
    {ID : 5,
    Status : 'Completed'},
    ]

我想要的结果:

var filter_data = [
    {ID : 1,
    Status : 'Fail'},
    {ID : 2,
    Status : 'Fail'},
    {ID : 3,
    Status : 'Fail'},
    {ID : 4,
    Status : 'Completed'},
    {ID : 5,
    Status : 'Completed'},
    ]

我想尝试.filter()任何人都可以参考任何参考或示例来解决我发布的问题?

================================================ ==========================

我还有另一个复杂的问题需要解决(于19/7/2019更新)

var new data = [
    {ID : 150042379,
    Name : Cake 1234
    Status : 'Not Reservable'
    Code ID : 302},
    {ID : 150042379,
    Name : Cake 1234
    Status : 'Reservable'
    Code ID : 302},
    {ID : 150042379,
    Name : Bread 1236 Ticket
    Status : 'Reservable'
    Code ID : 391},
    {ID : 150053213,
    Name : Bread Basic 8
    Status : 'Reservable'
    Code ID : 201},
    {ID : 150053213,
    Name : Bread Basic 6
    Status : 'Reservable'
    Code ID : 301},
    {ID : 150054121,
    Name : Bread Basic 16
    Status : 'Not Reservable'
    Code ID : 202},
    {ID : 150054121,
    Name : Bread Basic 16
    Status : 'Reservable'
    Code ID : 202},
    {ID : 150057599,
    Name : Bread Riche
    Status : 'Reservable'
    Code ID : 232},
    ]

基本上我们需要检查两个条件,即ID和Code ID

例如1,

ID和代码ID相同,并且状态为不可保留或可保留,我们将删除状态为可保留的ID和代码ID

例如2,

ID和代码ID相同,并且状态为“已完成”或“可保留”,我们将删除状态为“已完成”的ID和代码ID

例如3

如果2个I​​D相同,而代号ID不同,我们将在列表中同时显示这两个

所以我想要的结果

var filter_new_data = [
        {ID : 150042379,
        Name : Cake 1234
        Status : 'Not Reservable'
        Code ID : 302},
        {ID : 150042379,
        Name : Bread 1236 Ticket
        Status : 'Reservable'
        Code ID : 391},
        {ID : 150053213,
        Name : Bread Basic 8
        Status : 'Reservable'
        Code ID : 201},
        {ID : 150053213,
        Name : Bread Basic 6
        Status : 'Reservable'
        Code ID : 301},
        {ID : 150054121,
        Name : Bread Basic 16
        Status : 'Not Reservable'
        Code ID : 202},
        {ID : 150057599,
        Name : Bread Riche
        Status : 'Reservable'
        Code ID : 232},
        ]

1 个答案:

答案 0 :(得分:1)

要获得预期的结果,请使用下面的选项,使用reduce和Object.values仅循环一次,并避免多个循环进行比较

  1. 使用reduce循环
  2. 创建ID为键的对象
  3. 使用ID检查状态并更新累加器对象
  4. 使用object.values获取已过滤对象的值

var data = [
    {ID : 1,
    Status : 'Completed'},
    {ID : 1,
    Status : 'Fail'},
    {ID : 2,
    Status : 'Fail'},
    {ID : 2,
    Status : 'Completed'},
    {ID : 3,
    Status : 'Fail'},
    {ID : 4,
    Status : 'Completed'},
    {ID : 5,
    Status : 'Completed'},
    ]

var filter_data = Object.values(data.reduce((acc, v) =>{
  if(acc[v.ID]){
acc[v.ID] = acc[v.ID].Status === 'Fail'? acc[v.ID] : v;
  }else{
acc[v.ID] = v
  }
  return acc  
},{}))

console.log(filter_data);

codepen-https://codepen.io/nagasai/pen/qzeYZG?editors=1010