如何用JavaScript将Elasticsearch查询结果的_source扁平化至单层数组
解决Elasticsearch查询结果的_source扁平化问题
我懂你要实现的效果:把Elasticsearch返回的每个hit对象里的_source字段展开,把里面的属性加上_source_前缀后,和顶层的_id、_score合并成单个对象,同时保持数组的原有结构——每个原hit对应一个新对象。你的错误代码是把整个数组当成单一对象来处理了,所以才会出现带索引前缀的奇怪结构。
这里给你一个简洁可靠的实现方案:
// 转换current_array为期望的desired_array const desired_array = current_array.map(hit => { // 初始化新对象,保留顶层的_id和_score const result = { _id: hit._id, _score: hit._score }; // 遍历_source的所有键值对,添加前缀后并入新对象 for (const [key, value] of Object.entries(hit._source)) { result[`_source_${key}`] = value; } return result; });
代码说明:
- 用
Array.map()遍历原数组,保证每个hit对象都被单独处理,最终返回的还是数组结构 - 先把顶层的
_id和_score直接复制到新对象里 - 通过
Object.entries()把_source拆解成键值对,循环给每个键加上_source_前缀,再赋值给新对象
你的原代码问题出在哪?
你写的flattenObject函数是用来扁平化单个嵌套对象的,但你把整个数组传进去了。它把数组的索引(0、1)当成了对象属性名,然后递归处理每个hit,最后把所有属性都挂到了一个数组的索引属性下,完全打乱了你想要的“每个hit对应一个独立对象”的结构。我们要做的是逐个处理数组中的每个对象,而不是扁平化整个数组本身。
内容的提问来源于stack exchange,提问作者Amith M G
相关产品推荐
相关产品推荐

