【问题标题】:JavaScript - How to filter the duplicate rows with another conditions applyJavaScript - 如何使用其他条件过滤重复行
【发布时间】:2019-07-16 16:01:07
【问题描述】:

我想用 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},
    ]

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

例如1,

ID与Code ID相同,Status为Not Reservable或Reservable,我们将移除状态为Reservable的ID和Code ID

例如2,

ID 和 Code ID 相同,Status 要么 Completed 要么 Reservable,我们将移除状态为 Completed 的 ID 和 Code ID

例如3,

如果2个I​​D相同,而Code 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},
        ]

【问题讨论】:

    标签: javascript arrays ecmascript-6 filter


    【解决方案1】:

    为了达到预期的效果,请使用以下选项,使用 reduce 和 Object.values 只循环一次,避免多次循环进行比较

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

    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

    【讨论】:

    • 嗨@Naga Sai A,我刚刚更新了问题并且更复杂。有空可以看看吗?
    • @weikian,在回答了最初的问题后,我认为这应该是一个复杂场景的新问题
    猜你喜欢
    • 2021-10-31
    • 2021-07-31
    • 2023-02-10
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    • 2018-08-22
    • 2017-02-13
    • 2023-03-18
    相关资源
    最近更新 更多