You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:28:28