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

JS嵌套map创建对象时返回多余索引字段的解决方案

问题原因

出现多余数字索引的核心问题是展开逻辑写错了:你直接把rules.map()返回的对象数组展开到了目标对象里。
数组本质是带数字下标的特殊对象,用...把数组展开到普通对象时,会把数组的数字下标作为键、对应位置的元素作为值拷贝进对象,自然就生成了'0': {price:50}、'1': {release:3}这类多余属性。
嵌套map完全可以实现需求,不是方法的问题——你需要把规则列表转成一个平铺的键值对对象再展开,而不是直接展开map生成的对象数组。

修复方法

提前把规则数组处理成单个键值对对象,构造每个房价条目时直接展开这个对象就行,不会产生多余索引。

修正后代码

const rateRequest = {rate: []}
const roomtypes = [100, 101]
const restriction = {
  roomtypes: {
    100: [201],
    101: [201,202]
  }
}
const rules = [
  { field: 'price', value: 50 },
  { field: 'release', value: 3 }
]

// 预处理规则为平铺对象:{ price: 50, release: 3 }
const ruleProps = Object.fromEntries(rules.map(r => [r.field, r.value]))

roomtypes.forEach((roomtype) => 
    rateRequest.rate.push(
        ...restriction.roomtypes[roomtype].map((rateplanId) => ({
            roomtypeId: roomtype,
            rateplanId: rateplanId,
            ...ruleProps
        }))     
    )
)

console.log(rateRequest)

运行后输出的结构和你预期的完全一致。如果不想单独存规则对象,也可以在map回调里用Object.assign({}, ...rules.map(r => ({[r.field]: r.value})))代替展开ruleProps,不过提前预处理的写法可读性更好,性能也更高(不用每个条目都重新遍历一次rules数组)。


内容的提问来源于stack exchange,提问作者Marc Pont

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 12:06:19