【问题标题】:Remove all array of objects that contain same key and has at least one value true删除所有包含相同键且至少有一个值为 true 的对象数组
【发布时间】:2021-11-28 01:57:42
【问题描述】:

您好,我有一个对象数组,其中字符串以特定前缀开头,如果该键值为真,则删除数组中包含相同键(前缀)的所有对象

下面是对象数组:

const data = [{
    field_name_key: "Recive_IsViaEmail",
    fieldValue: false
  },
  {
    field_name_key: "Recive_IsViaSMS",
    fieldValue: false
  },
  {
    field_name_key: "Sender_IsViaEmail",
    fieldValue: false
  },
  {
    field_name_key: "Sender_IsViaSMS",
    fieldValue: true
  },

]

这里 "Sender_IsViaSMS" 包含 true 因此删除所有以前缀键 Sender_IsVia 开头的对象

最终结果是这样的:

const data = [{
    field_name_key: "Recive_IsViaEmail",
    fieldValue: false
  },
  {
    field_name_key: "Recive_IsViaSMS",
    fieldValue: false
  }
]

【问题讨论】:

  • 我想你会发现 this Q&A 正是你要找的东西

标签: javascript angular


【解决方案1】:

一个低效但简短的解决方案是使用Array.filter并将回调的条件设置为data是否包含具有相同field_name_key属性前缀且其fieldValue属性为true的项目:

const data=[{field_name_key:"Recive_IsViaEmail",fieldValue:false},{field_name_key:"Recive_IsViaSMS",fieldValue:false},{field_name_key:"Sender_IsViaEmail",fieldValue:false},{field_name_key:"Sender_IsViaSMS",fieldValue:true}];

const res = data.filter(e => !data.find(f => f.field_name_key.split("IsVia")[0] == e.field_name_key.split("IsVia")[0] && f.fieldValue))

console.log(res)

【讨论】:

    【解决方案2】:

    您可以创建一个函数,首先找到要删除的条目,然后逐个删除:

    const data = [{
        field_name_key: "Recive_IsViaEmail",
        fieldValue: false
      },
      {
        field_name_key: "Recive_IsViaSMS",
        fieldValue: false
      },
      {
        field_name_key: "Sender_IsViaEmail",
        fieldValue: false
      },
      {
        field_name_key: "Sender_IsViaSMS",
        fieldValue: true
      },
    
    ]
    
    const sanitizeData = (list) => {
        // find entry keys to remove
        const toRemove = list.reduce((prev, el) => {
            if(el.fieldValue === true) return el.field_name_key.split('_')[0]
        })
        // remove
        const removed = list.filter(el => {
            return !toRemove.includes(el.field_name_key.split('_')[0])
        })
        return removed
    }
    
    console.log(sanitizeData(data))

    【讨论】:

    • { "field_name_key": "Sender_IsViaEmail", "fieldValue": false } 这不应该出现在最终结果中,因为“Sender_IsViaSMS”为真,因此具有前缀 Sender_IsVia 的所有对象都包含相同前缀应该删除
    • 好的。我改进了答案。看看吧
    【解决方案3】:

    首先建立一个要删除的前缀列表,然后运行一个过滤器。

    但是,我不确定您是如何提出给定字段名称的前缀的。鉴于您的示例,您期望“Sender_IsViaSMS”也清除“Recive_IsViaSMS”。但是您应该能够接受并根据自己的需要进行调整。

    const data=[{field_name_key:"Recive_IsViaEmail",fieldValue:false},{field_name_key:"Recive_IsViaSMS",fieldValue:false},{field_name_key:"Sender_IsViaEmail",fieldValue:false},{field_name_key:"Sender_IsViaSMS",fieldValue:true}];
    
    const prefixsToAxe = new Set();
    
    // Having trouble with this part in your question, so ran with this, replace as you see fit
    const determinePrefix = (field_name_key) => field_name_key.split('IsVia')[0];
    
    for (const entryToAxe of data.filter(x => x.fieldValue === true)) {
      const prefixToAxe = determinePrefix(entryToAxe.field_name_key);
      prefixsToAxe.add(prefixToAxe);
    }
    
    const purged = data.filter(entry => {
      const prefixInQuestion = determinePrefix(entry.field_name_key);
      return !prefixsToAxe.has(prefixInQuestion);
    })
    
    console.log(purged)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-07
      • 2021-04-17
      • 2022-07-27
      • 1970-01-01
      相关资源
      最近更新 更多