簡體   English   中英

通過字符串數組和字符串數組的屬性過濾對象數組

[英]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.

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