【问题标题】:filtering nested array of objects using search string in javascript使用 javascript 中的搜索字符串过滤嵌套的对象数组
【发布时间】:2017-12-21 04:31:13
【问题描述】:
{  
"rResponse":{  
    "rDetailsList":[  
        {  
            "rDate":"April 01, 2018",
            "rList":[  
                {  
                    "aName":"GOKQG C HQFUDHFPX",
                    "aNumber":"P3799838628"
                },
                {  
                    "aName":"IGNDPJR D EKYJYC",
                    "aNumber":"P3899820579"
                }
            ]
        },
        {  
            "rDate":"Jan 01, 2018",
            "rList":[  
                {  
                    "aName":"",
                    "aNumber":"A39A4035073"
                },
                {  
                    "aName":"YVTLW K SIGLC",
                    "aNumber":"A270M040558"
                }
            ]
        }
    ]
}

}

getFilteredResult(rDetails, searchText) {
                const regex = new RegExp(searchText, 'i');
                let result= rDetails.filter(a => 
                     a.rList.some(rItem=>
                    (rItem.aName.search(regex) > -1) ||
                            (rItem.aNumber.search(regex) > -1)  
                    ))
                console.log(result,"filteredResults")
                return result;
            }

let result=getFilteredResult(rResponse.rDetailsList, "A270M040558"):

我正在使用上述函数根据搜索字符串过滤数据。

我想过滤对象的嵌套数组保持对象的结构相同 上述函数的输出如下,我得到一个列表的所有对象,而不是只得到一个与搜索文本匹配的对象

{
"rResponse": {
    "rDetailsList": [{
        "rDate": "Jan 01, 2018",
        "rList": [{
                "aName": "",
                "aNumber": "A39A4035073"
            },
            {
                "aName": "YVTLW K SIGLC",
                "aNumber": "A270M040558"
            }


        ]
    }]
}

}

预期的输出是

{
"rResponse": {
    "rDetailsList": [{
        "rDate": "Jan 01, 2018",
        "rList": [
            {
                "aName": "YVTLW K SIGLC",
                "aNumber": "A270M040558"
            }


        ]
    }]
}

}

【问题讨论】:

标签: javascript jquery arrays json lodash


【解决方案1】:

您有 2 个数组,因此您需要先过滤第一个数组,然后再过滤第二个数组:

const rDetailsList = [  
        {  
            "rDate":"April 01, 2018",
            "rList":[  
                {  
                    "aName":"GOKQG C HQFUDHFPX",
                    "aNumber":"P3799838628"
                },
                {  
                    "aName":"IGNDPJR D EKYJYC",
                    "aNumber":"P3899820579"
                }
            ]
        },
        {  
            "rDate":"Jan 01, 2018",
            "rList":[  
                {  
                    "aName":"",
                    "aNumber":"A39A4035073"
                },
                {  
                    "aName":"YVTLW K SIGLC",
                    "aNumber":"A270M040558"
                }
            ]
        }
    ];

const myFilter = (arr, num) => {
  const rDetails = arr.filter(det => !!det.rList.find(l => l.aNumber === num));
  
  return rDetails.map(det => {
    det.rList = det.rList.filter(l => l.aNumber === num);
    return det;
  });
};

console.log(myFilter(rDetailsList, 'A270M040558'));

【讨论】:

  • 谢谢,但是当我搜索它时,它给出了过滤数据,当我清除搜索时,它再次给出过滤数据而不是原始数据。
  • 这与上面的代码无关。检查其他部分或提出其他问题
【解决方案2】:
 const res = _.chain(rDetailsList)
     .map(rDetail => _.assign( // iterate array and set filtered rList
         {}, // use new object to avoid mutations
         rDetail,
         { rList: _.filter(rDetail.rList, { aNumber: 'A270M040558' }) }
     ))
     .reject(rDetail => _.isEmpty(rDetail.rList)) // remove elements with empty rList
     .value();

【讨论】:

    猜你喜欢
    • 2021-10-23
    • 2019-12-18
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多