为什么点表示法会返回具有附加属性的对象,而散布运算符却不会?

时间:2019-07-11 09:57:44

标签: javascript

我有一个根据条件返回新对象的函数。为什么当我使用点表示法时它会返回新对象,而散布运算符却不会

此行返回具有新属性的新对象


const newValue = values => {
 const condition = "SUCCESS"

 const result = values.filter(r => {
    if(condition === "SUCCESS"){
     r.codes = "Success Test"
     return r
    }
    r.codes = "Fail Test"
    return r     
 })

 return result
}

此行返回没有新属性的旧对象


const newValue = values => {
 const condition = "SUCCESS"

 const result = values.filter(r => {
    if(condition === "SUCCESS"){
     return { ...r, codes: "Success Test" }
    }
    return { ...r, codes: "Fail Test" }  
 })

 return result
}

预期结果应为:

result = [{ name:"Hey", codes:"Success Test" }]

2 个答案:

答案 0 :(得分:5)

filter仅关心传递给它的函数返回的值(可以强制转换为truefalse

在两种情况下,您都返回一个对象。对象始终是真实值,因此原始数组中的值在过滤后的数组中保持保留

在第一个示例中,您返回的对象是您修改的原始对象。

在第二个示例中,您返回的对象是一个 new 对象,因此原始对象未被修改。由于filter仅涉及truefalse,因此它总是返回原始对象(如果您修改了原始对象,则该对象仅具有新属性)


总是返回一个真值,而从不返回一个假值,这使得使用filter毫无意义。

您似乎正在尝试map而不是filter数组。

答案 1 :(得分:1)

.filter回调用于获取一个数组,并创建一个与旧数组相同的新数组,只是根据条件删除了一些项。在这里,您错误地使用了.filter,因为您都在对现有的数组项(分配了r.codes =进行了变异) ,并且您总是从{ {1}}回调(而且对象总是真实的,因此原始数组中的每个项目都会出现在输出数组中)。

由于分配给.filter会使现有数组发生突变,并且由于r.codes将始终是原始数组(包含突变项),因此分配给result会导致数组发生更改。 / p>

当您扩展到新的返回对象中时,将检查该对象的真实性(对象为真实),然后丢弃;该对象不在其他任何地方使用。

如果要变异现有对象,请使用r.codes(这是仅用于副作用的适当数组方法):

forEach

如果您不想变异现有对象,请使用const newValue = values => { const condition = "SUCCESS" values.forEach(value => { value.codes = condition === "SUCCESS" ? "Success Test" : 'Fail Test'; }); return values; } 并传播:

.map