如何过滤对象中嵌套translations内field为name的text值
文档数组过滤:匹配translations中name字段的文本值
现有数据结构
[ { "id": 61, "created_at": "2022-11-02T15:36:25+00:00", "updated_at": "2022-11-02T15:36:25+00:00", "translations": [ { "field": "name", "lang": "it", "text": "IT_Codice di Condotta_NEW" }, { "field": "name", "lang": "en", "text": "EN_Code of Conduct_NEW" }, { "field": "pdf_url", "lang": "en", "text": "/var/www/vhosts/marchettopellami.com/reservedarea.marchettopellami.com/docs/docs/en/a-20221125081444740491.pdf" }, { "field": "pdf_url", "lang": "it", "text": "/var/www/vhosts/marchettopellami.com/reservedarea.marchettopellami.com/docs/docs/it/draft-20221127194030220505.pdf" } ] }, { "id": 63, "created_at": "2022-11-02T15:38:40+00:00", "updated_at": "2022-11-02T15:38:40+00:00", "translations": [ { "field": "name", "lang": "it", "text": "IT_NEW" }, { "field": "name", "lang": "en", "text": "EN_NEW" }, { "field": "pdf_url", "lang": "en", "text": "TheFerrari-GlobalMarketingStrategy-20221124133159490323.pdf" }, { "field": "pdf_url", "lang": "it", "text": "20221124160623761884.pdf" } ] } ]
需求与原有问题
需求是过滤出translations数组中field为"name"的元素对应的text值匹配输入关键词的文档(例如匹配IT_Codice di Condotta_NEW或EN_Code of Conduct_NEW)。
原有代码仅能匹配id、created_at、updated_at这些基础字段,无法遍历translations数组里的内容:
const resultsArray = documents.filter((d) => { return Object.values(d) .join(" ").toLowerCase() .includes(e.target.value.toLowerCase()) });
修改后的代码方案
我们需要单独处理translations数组,筛选出其中field为"name"的文本,再和基础字段一起做匹配:
const searchTerm = e.target.value.toLowerCase(); const resultsArray = documents.filter(doc => { // 匹配基础字段(id、created_at、updated_at) const baseFieldsMatch = Object.values(doc) .filter(val => typeof val !== 'object') // 排除translations数组 .join(" ").toLowerCase() .includes(searchTerm); // 匹配translations中field为name的text值 const nameTranslationsMatch = doc.translations.some(translation => { return translation.field === 'name' && translation.text.toLowerCase().includes(searchTerm); }); // 只要基础字段或name文本有一个匹配就保留该文档 return baseFieldsMatch || nameTranslationsMatch; });
代码说明
- 先提取并统一转换搜索关键词为小写,避免大小写敏感问题
baseFieldsMatch:保留原有对基础字段的匹配逻辑,但排除了translations这个数组类型的值nameTranslationsMatch:使用Array.some()遍历translations数组,只要有一个field为"name"且文本包含搜索词的元素,就返回true- 最终返回基础字段匹配或name文本匹配的文档,满足需求
内容的提问来源于stack exchange,提问作者beginnerspirit
相关产品推荐
相关产品推荐

