繁体   English   中英

搜索对象的Javascript数组

[英]Search Javascript Array of Objects

我正在尝试通过字符串过滤javascript对象数组。 但是我希望过滤器查看每个属性并对其进行测试,以查看字符串是否有效。 AngularJS有一个内置的过滤器可以做到这一点,但是我在SO上找不到任何解决方案。

[
    {
        "title":"Mr.",
        "name":"John Smith",
        "firstName":"John",
        "lastName":"Smith"
    },
    {
        "title":"Mr.",
        "name":"Bill Smith",
        "firstName":"Bill",
        "lastName":"SMith"
    }

]

因此,例如,如果我为文本字符串输入“ Jo”,它将带回索引0处的对象,如果您只想按单个属性进行搜索,这很容易做到。

现在,如果我输入“ Mr”,它应该带回索引0和索引1的两项,因为我们正在搜索所有属性。

希望这对我的要求有意义。

编辑:非常抱歉昨天晚上很晚,我在数据结构中省略了非常重要的细节。

{
        "title":"Mr.",
        "name":"John Smith",
        "firstName":"John",
        "lastName":"Smith",
        "contactType":{
            "name":"test"
        },
        "addresses":[
            {"address":"Test Street One"},
            {"address":"Test Street Two"},
        ]
    },
    {
        "title":"Mr.",
        "name":"Bill Smith",
        "firstName":"Bill",
        "lastName":"SMith",
        "contactType":{
            "name":"test"
        },
        "addresses":[
            {"address":"Test Street One"},
            {"address":"Test Street Two"},
        ]
    }

因此,在这种情况下,搜索将考虑对象内任何类型和任意数量的嵌套对象。 对不起,忘记了这一部分。

您可以遍历数组的对象并使用indexof查找具有输入字符串的元素,

DEMO

 var myarray =[ { "title":"Mr.", "name":"John Smith", "firstName":"John", "lastName":"Smith" }, { "title":"Mr.", "name":"Bill Smith", "firstName":"Bill", "lastName":"SMith" } ]; var toSearch = "Mr"; var results =[]; for(var i=0; i<myarray.length; i++) { for(key in myarray[i]) { if(myarray[i][key].indexOf(toSearch)!=-1) { results.push(myarray[i]); } } } console.log(results) 

您可以结合使用Array#filterObject.values来实现此目的:

 let data = [{ "title": "Mr.", "name": "John Smith", "firstName": "John", "lastName": "Smith" }, { "title": "Mr.", "name": "Bill Smith", "firstName": "Bill", "lastName": "SMith" } ]; let string = 'Jo'; let results = data.filter(item => Object.values(item).some(value => value.includes(string))); console.log(results); 

遍历每个对象的所有属性:

 var items = [{ "title": "Mr.", "name": "John Smith", "firstName": "John", "lastName": "Smith" }, { "title": "Mr.", "name": "Bill Smith", "firstName": "Bill", "lastName": "SMith" }]; console.log("Jo :", items.filter(x => contains(x, "Jo")).map(x => x.name)); console.log("Mr :", items.filter(x => contains(x, "Mr")).map(x => x.name)); function contains (x, w) { for (let k in x) { if (x[k].indexOf(w) !== -1) { return true; } } return false; } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM