【js】使用filter函数过滤数组里的json再嵌套数组里的项

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" }] }]
上一篇:这样下去 GitHub 迟早被你们毁了


下一篇:vue 过滤器filter