如何将对象数组转为保留子对象的嵌套对象适配Elasticsearch?
解决数组转嵌套对象(保留子对象)的问题
首先得提一句:你给出的目标代码其实存在语法错误——JavaScript对象里不能直接放置未命名的子对象,每个子项都需要有对应的键。结合你提到的Elasticsearch bool查询适配场景,我猜你想要的是把数组里的每个条件对象,作为父对象的带键子项保留下来,而不是合并成一个大对象。
原始数据结构
const obj = { "key": [ { "name": { "companyName": "Something" } }, { "otherThing": { "coolThing": "coolThingName" } } ] };
符合语法的目标结构
我们可以用数组的索引作为子对象的键,这样既保留了每个子对象的独立性,又转换成了合法的对象格式:
const transformedObj = { "key": { "0": { "name": { "companyName": "Something" } }, "1": { "otherThing": { "coolThing": "coolThingName" } } } };
实现代码
这里不用普通的合并式reduce,而是用它来构建一个以索引为键的对象,完美保留每个子对象:
const transformArrayToNestedObj = (data) => { return { ...data, key: data.key.reduce((acc, item, index) => { acc[index] = item; // 把每个子对象以索引为键存入结果 return acc; }, {}) // 初始值设为空对象 }; }; // 调用示例 const originalObj = {"key": [ { "name": { "companyName": "Something" } }, { "otherThing": { "coolThing": "coolThingName" } } ]}; const result = transformArrayToNestedObj(originalObj); console.log(result);
适配Elasticsearch的特殊调整
如果你的Elasticsearch场景需要特定的键名(而非索引),比如每个子对象里有唯一标识字段,可以修改reduce逻辑提取对应键。比如子对象都有conditionType字段,就可以把acc[index] = item替换成acc[item.conditionType] = item,完全贴合你的业务需求。
这样转换后,每个原数组里的子对象都完整保留,没有被合并,刚好满足你需要的对象格式要求。
内容的提问来源于stack exchange,提问作者Jarred Parr
相关产品推荐
相关产品推荐

