簡體   English   中英

刪除包含相同鍵且至少有一個值為 true 的所有對象數組

[英]Remove all array of objects that contain same key and has at least one value true

您好我有一個對象數組,其字符串以特定前綴開頭,如果該鍵值為真,則刪除包含相同鍵(前綴)的數組中的所有對象

下面是object的數組:

 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 } ]

一個低效但簡短的解決方案是使用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)

您可以創建一個 function ,它首先找到要刪除的條目,然后逐一刪除:

 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))

首先建立要刪除的前綴列表,然后運行過濾器。

但是,我不確定您是如何想出給定字段名稱的前綴的。 鑒於您的示例,您期望“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)

暫無
暫無

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

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