如何结合扩展运算符与条件替换数组中的对象属性?
数组对象条件替换属性失效问题排查
我有一个对象数组,需要完成以下操作:
- 检查对象是否包含特定键值对
- 若存在,替换该对象的另一属性值
- 返回所有对象
我试了几种结合扩展运算符的条件写法,但都没法修改目标对象:
list.map(item => { return { ...item, ...(item["orderId"] === 'xyz' && { transactionNumber: 'sadfdas gasdgas' }), } })
还有这些变体:
...(orderId === 'xyz' && { transactionNumber: 'sadfdas gasdgas' })...(item.orderId === 'xyz' && { transactionNumber: 'sadfdas gasdgas' })...(item.orderId === 'xyz' ? { transactionNumber: 'sadfdas gasdgas' } : {})
但无条件替换属性的写法却能正常生效:
list.map(item => { return { ...item, transactionNumber: 'sadfdasgasdgas' } })
示例说明
输入数组1:
const list = [{ aaa: 123, bbb: 222, orderId: 555, transactionNumber: 888 }, { aaa: 123, bbb: 222, orderId: 555, transactionNumber:999 }]
处理后结果与输入一致。
输入数组2:
[{ aaa: 123, bbb: 222, orderId: "xyz", transactionNumber: 888 }, { aaa: 123, bbb: 222, orderId: 555, transactionNumber:"sadfdasgasdgas" }]
预期处理结果:
[{ aaa: 123, bbb: 222, orderId: "xyz", transactionNumber: 888 }, { aaa: 123, bbb: 222, orderId: 555, transactionNumber:999 }]
问题原因与解决方法
你的条件写法核心问题是判断逻辑和需求完全相反,还存在类型不匹配的问题:
- 你要修改的是
orderId为555的对象,但你的判断条件是item.orderId === 'xyz',完全没命中目标对象; - 输入里的
orderId:555是数字类型,而你用字符串'xyz'做判断,即便要匹配555,用===的话也要写成item.orderId === 555(数字),否则类型不匹配会导致判断为false。
正确的写法应该把条件改成匹配目标键值对,比如针对输入数组2的需求,应该写成:
list.map(item => { return { ...item, // 匹配orderId为555的对象,替换transactionNumber为999 ...(item.orderId === 555 ? { transactionNumber: 999 } : {}) } })
另外,用&&的写法要注意:如果条件为false,&&会返回false,扩展运算符无法处理布尔值,所以更稳妥的是用三元运算符返回空对象或者目标对象,避免潜在问题。
内容的提问来源于stack exchange,提问作者Pikk
相关产品推荐
相关产品推荐

