[英]Get an array of objects that match condition in nested object
我有一個對象數組是這樣的:
array_ = [
{id: "id_one", name:"name_one"},
{id: "id_two", name:"name_two"},
{
id:"id_three",
data: [
{data:0,name:"name_three"},
{data:0,name:"name_four"}
]
},
{id: "id_four", name: "name_five"}
]
你可以看到有些是簡單的對象,但有些有一個子對象數組,但每個都有鍵name
。
現在,我要做的是找到所有具有包含字符串的name
字段的對象。
例如,如果我想查找name
值包含字符串"name_"
的所有對象,它應該返回array_
中所有對象的數組。
但是,如果我測試字符串"name_t"
,我希望它返回一個包含 id:two object 和 id:three,data[0] 的 object 的數組。
本質上,一個搜索欄。
但我希望它只搜索字符串的開頭。 因此,如上所示, "name_"
將返回所有內容,但"ame_"
將不返回任何內容。
我不知道這是否有意義,但如果確實如此,我希望有人可以幫助我。
最小代碼:
HTML:
<body>
<input id="text-input" type="text"
</body>
JavaScript(我正在使用 jQuery):
$('#text-input').on('input', () => {
let inputValue = $('#text-input').val()
function deepSearch (object, key, predicate) {
if (object.hasOwnProperty(key) && predicate(key, object[key]) === true) return object
for (let i = 0; i < Object.keys(object).length; i++) {
if (typeof object[Object.keys(object)[i]] === "object") {
let o = deepSearch(object[Object.keys(object)[i]], key, predicate)
if (o != null) return o
}
}
return null
}
let object_ = deepSearch(array_, "name", (k, v) => v.includes(inputValue))
console.log(object_)
})
這是使用我在這個問題上找到的功能
這個 function幾乎是我需要的。
但是,它返回包含字符串的第一個object,而我想要一個包含所有匹配對象的數組。
不一定需要 jQuery。 您可以編寫一個遞歸 function 將謂詞回調應用於樹中的每個節點並保留匹配的節點,從而在 arrays 向上走回樹時展平。 謂詞允許您指定任何匹配條件並為調用者提供靈活性。
const findNested = (children, predicate, childProp="data") => { const found = []; for (const node of children) { if (node[childProp]) { found.push(...findNested(node[childProp], predicate)); } if (predicate(node)) { found.push(node); } } return found; }; const tree = [ {id: "id_one", name:"name_one"}, {id: "id_two", name:"name_two"}, { id:"id_three", data: [ {data:0,name:"name_three"}, {data:0,name:"name_four"} ] }, {id: "id_four", name: "name_five"} ]; const predicate = e => e.name && e.name.startsWith("name_t"); console.log(findNested(tree, predicate));
試試這個 function 遞歸搜索 object 並將它們附加到數組中:
function search(arr, str) {
var ret = [];
for (var i = 0; i < arr.length; i ++) {
if (typeof arr[i].name == "string" && arr[i].name.startsWith(str)) {
ret.push(arr[i]);
} else if (arr[i].data instanceof Array) {
ret = ret.concat(search(arr[i].data, str));
}
}
return ret;
}
search(array_, "name_t"); // array with the 2 matched objects
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.