JavaScript如何过滤嵌套对象/数组的值并重构返回结果
问题原因
你的现有代码只完成了外层files.All数组的筛选逻辑:通过some判断只要外层对象的Files数组里存在符合要求的文件,就把整个外层对象保留下来,但没有对内部的Files数组本身做裁剪,因此不符合条件的文件(比如示例中的B)会跟着外层对象一起被返回。
解决思路
需要做两层处理:
- 先遍历每个外层对象,对其内部的
Files数组做过滤,只保留文件名在目标列表中的文件 - 再过滤掉内部
Files数组为空的外层对象,得到最终结果
ES5 实现代码
var filenames = ["A","C"]; var test = files['All'].map(function (obj) { // 过滤当前对象下的Files数组,仅保留符合条件的文件 var validFiles = obj.Files.filter(function (file) { // ES5 用indexOf替代includes判断元素是否存在 return filenames.indexOf(file.Filename) !== -1; }); // 构造新对象返回,避免修改原数据 return { isPublic: obj.isPublic, Files: validFiles }; }).filter(function (item) { // 仅保留仍有有效文件的外层对象 return item.Files.length > 0; }); console.log(test);
运行效果
执行后返回的结果中,所有Files数组都不会存在不符合条件的文件项,示例中的文件名B会被完全过滤掉。
内容的提问来源于stack exchange,提问作者mat
相关产品推荐
相关产品推荐

