簡體   English   中英

在嵌套的 object 中獲取匹配條件的對象數組

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

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