如何在JavaScript中按unique_id过滤嵌套对象数据?
问题分析与解决方案
先看你提供的原始数据结构:
data = [{ id: 1, tables: { headers: [ { headerName: 'First Name', values: [ {id: 1, text_value: 'John', unique_id: '3UPYR2'}, {id: 2, text_value: 'Nick', unique_id: 'WKKHCM'} ] }, { headerName: 'Last Name', values: [ {id: 1, text_value: 'Doe', unique_id: '3UPYR2'}, {id: 2, text_value: 'Smith', unique_id: 'WKKHCM'} ] } ] } }]
你的需求是过滤每个header下的values数组,只保留指定unique_id的项,但你写的代码存在两个关键问题:
你的代码问题点
- 属性名拼写错误:原始数据里是
rec.tables(复数形式),你写成了rec.table(单数),这会直接导致undefined.some()报错,或者返回false,最终过滤结果为空。 - 逻辑方向错误:
data.filter()是用来筛选最外层的数组项(也就是你这里的整个对象),而不是修改内层的values数组。你当前的代码只是判断外层对象是否包含符合条件的unique_id,然后保留整个外层对象,完全没处理内层的values过滤。
正确实现方法
要实现需求,需要遍历外层数组,同时对每个对象里的tables.headers进行处理,过滤每个header.values数组,用map配合filter就能完成,同时注意不要修改原数据:
const myUniqueId = '3UPYR2'; // 你要过滤的目标unique_id const filteredData = data.map(item => { // 复制外层对象,避免修改原数据 return { ...item, tables: { // 处理tables里的headers数组 headers: item.tables.headers.map(header => { return { ...header, // 过滤当前header下的values数组,只保留匹配项 values: header.values.filter(value => value.unique_id === myUniqueId) }; }) } }; }); console.log(filteredData);
这段代码的逻辑:
- 用
data.map()遍历最外层的每个对象,因为我们要保留所有外层对象,只修改内层结构 - 对每个对象的
tables.headers数组用map()遍历,保留每个header的其他属性,只修改values字段 - 对每个
header.values用filter()筛选出unique_id匹配的项
执行后就能得到你想要的结构:
[{ id: 1, tables: { headers: [ { headerName: 'First Name', values: [ {id: 1, text_value: 'John', unique_id: '3UPYR2'} ] }, { headerName: 'Last Name', values: [ {id: 1, text_value: 'Doe', unique_id: '3UPYR2'} ] } ] } }]
额外说明
如果你的原始数据里有多个外层对象,或者某个header.values里没有匹配项,这段代码也能处理:没有匹配项的values会变成空数组,外层对象都会被保留。如果需要过滤掉那些完全没有匹配项的外层对象,可以在map之后再加一层filter判断。
内容的提问来源于stack exchange,提问作者doozy
相关产品推荐
相关产品推荐

