[英]Filter array of objects by property with array of strings with an array of strings
所以我有看起來像這樣的數據:
const data = [
{ foo: ["0001|main|0002", "0001|main|0014", "0001|main|0016"] },
{ foo: ["0001|main|0014", "0001|main|0018", "0001|main|0019"] },
{ foo: []},
{ foo: ["0001|main|0001", "0001|main|0012", "0001|main|0022"] },
];
我需要使用如下所示的字符串數組對其進行過濾:
let selections = ["0014", "0016"];
我需要僅在數據中為數字匹配具有相同最后一個的項目,我目前有這樣的工作:
data.filter((item) => {
if(!item.foo.length) return false;
return selections.every((id) => item.foo.split('|')[2] === id)
});
我在選擇上面這樣的兩個 ID 時遇到的問題是什么都不返回。 我期望返回值是這樣的:
[
{foo: ["0001|main|0002", "0001|main|0014", "0001|main|0016"]},
{foo: ["0001|main|0014", "0001|main|0018", "0001|main|0019"]},
]
I works fine when selection has only one string in it. 我認為它搜索與選擇中的兩個字符串匹配的項目。
任何幫助,將不勝感激!
既然你想要
["0001|main|0014", "0001|main|0018", "0001|main|0019"]
要包含在內,聽起來您至少需要一個選擇來匹配,而不是每個選擇都匹配。 所以,使用.some
而不是.every
。
const data = [ { foo: ["0001|main|0002", "0001|main|0014", "0001|main|0016"] }, { foo: ["0001|main|0014", "0001|main|0018", "0001|main|0019"] }, { foo: []}, { foo: ["0001|main|0001", "0001|main|0012", "0001|main|0022"] }, ]; const selections = ["0014", "0016"]; const result = data.filter( ({ foo }) => selections.some( sel => foo.some( str => str.endsWith(sel) ) ) ); console.log(result);
當前解決方案的問題是您嘗試在數組上使用 split() 方法,而 split 方法適用於字符串。
我確信可能有更清潔的方法來解決這個問題,但這是我很快想到的。
您必須首先遍歷數據數組,然后遍歷 item.foo 的每個子元素。 然后,這允許您運行與您正在執行的操作類似的檢查,就像三元操作一樣,而不是將所有所需的項目推送到一個虛擬數組,然后可以將其作為結果返回。
const data = [{ foo: ["0001|main|0002", "0001|main|0014", "0001|main|0016"] }, { foo: ["0001|main|0014", "0001|main|0018", "0001|main|0019"] }, { foo: [] }, { foo: ["0001|main|0001", "0001|main|0012", "0001|main|0022"] }, ]; let selections = ["0014", "0016"]; const filteredItems = []; data.forEach((item) => { item.foo.forEach(fooItem => { if (!fooItem.length) return false; selections.every((id) => fooItem.split('|')[2] === id ? filteredItems.push(item.foo) : false); }) }); console.log(filteredItems)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.