1.背景
在工作中遇到一个问题,服务器返回了一个数组,里面嵌套json,json里又有数组,每个数组又都是json,需要在这些json的某个字段搜索符合要求的json并且保留下来。该数组的结构如下
var arr = [
{
"A": "xxxxx",
"B": [
{
"aa":"xxxxxxx",
"bb": "被搜索文字11"
},
{
"aa":"xxxxxxx",
"bb": "被搜索文字22"
},
{
"aa":"xxxxxx15154165",
"bb": "被搜索文字3232311"
}
]
},
{
"A": "65416541545",
"B": [
{
"aa": "xxxxx",
"bb": "被搜索文字22呜呜呜呜"
},
{
"aa": "xxxxx",
"bb": "被搜索文字22hahhahhaha"
},
{
"aa": "xxxxx",
"bb": "被搜索文字22哇哦玩"
},
...
]
},
...
]
被搜索的文字就是在arr[i].B[j].bb
,判断该value是否包含某个字符串,有则保留或提取出来
2.实现
我想使用数组的filter方法进行过滤,因为存在嵌套,所以可以使用两次filter
var searchWord = "11"
var arr = [
...
]
// 先找出嵌套数组里所有符合要求的json
let newArray = []
arr.forEach((item,index)=>{
newArray[index] = item
newArray[index].B = item.B.filter((item) => {
return item.bb.indexOf(searchWord) != -1
})
})
// 过滤掉上次过滤之后已经为空的数组
let newArray2 = newArray.filter((item)=>{
return item.B != false
})
console.log("newArray:", newArray)
console.log("newArray2:", newArray2)
嗯,我想我写的代码的确非常low,还是同事的好
var searchWord = '11'
var arr = [
...
]
let newArr = []
arr.forEach((item) => {
let res = item['B'].filter((j) => j['bb'].includes(searchWord))
// console.log(res)
if(res && res.length) {
item['B'] = res
newArr.push(item)
}
})
console.log("newArr", newArr)
// 运行结果
// [{ A: "xxxxx", B: [{ aa: "xxxxxxx", bb: "被搜索文字11" }, { aa: "xxxxxx15154165", bb: "被搜索文字3232311" }] }]