我有一个根据条件返回新对象的函数。为什么当我使用点表示法时它会返回新对象,而散布运算符却不会
此行返回具有新属性的新对象
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" }]
答案 0 :(得分:5)
filter
仅关心传递给它的函数返回的值(可以强制转换为true
或false
。
在两种情况下,您都返回一个对象。对象始终是真实值,因此原始数组中的值在过滤后的数组中保持保留。
在第一个示例中,您返回的对象是您修改的原始对象。
在第二个示例中,您返回的对象是一个 new 对象,因此原始对象未被修改。由于filter
仅涉及true
或false
,因此它总是返回原始对象(如果您修改了原始对象,则该对象仅具有新属性)
您总是返回一个真值,而从不返回一个假值,这使得使用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