使用javascript中的搜索字符串过滤嵌套的对象数组

问题描述 投票:1回答:2
{  
"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
2个回答
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'));

0
投票
 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();
© www.soinside.com 2019 - 2024. All rights reserved.