TypeScript - 为什么在地图中使用展开运算符?
TypeScript - why is the spread operator used in map?
return items.map(item => ({
...item,
score: Math.round((item.rate / 100) * 5)
}));
我知道它会更改每个对象 score
的值 items
。但是为什么会有...item
?
使用它有什么好处?
等于这个吗?:
return items.map(item => ({
item.score: Math.round((item.rate / 100) * 5);
return item;
}));
相当于
Array.prototype.map.call(items, function(item) {
return Object.assign({}, item, {
score: Math.round((item.rate / 100) * 5)
});
});
这种方法的想法是创建新数组,并为旧创建的每个项目创建一个包含旧的所有属性和分数的新对象 属性。如果 score
出现在项目上(旧数组的条目将被新对象覆盖)
这是传播运算符,基本上是函数在做什么,获取每个项目,将其映射到包含以下内容的对象:项目的完整克隆,以及分数
{ item, score }
虽然您建议的函数只会 return 带有添加属性的项目对象 score
,并且还会将该属性添加到原始 items
数组中的元素,如您正在修改引用的对象,而不是它的副本。
使用哪个?嗯,这取决于你的需要。
使用 spread operator is useful, if you want to create a shallow copy of the existing values, and update the object/array immutably.
扩展语法的一个常见用法是当您对 Angular 使用 Redux for React.js or NgRX 时。
对于您提供的代码,
return items.map(item => ({
...item,
score: Math.round((item.rate / 100) * 5)
}));
生成的数组将是 items
数组与原始 properties/values 数组的浅表副本,后跟每个对象中 score
属性 的更新值items
数组。
与之前的答案相似,请注意展开运算符将 item
的内容展开到另一个花括号中。
将 item
的内容浅层复制到新对象中,但替换为 score
的新值。
这是一个内存高效的复制过程,代码可读性非常好。它与您的建议相似。
它只是在那种情况下提供了更好的语法糖。如果仅出于此目的以及它的其他用例,我建议您考虑多使用点差运算符。
return items.map(item => ({
...item,
score: Math.round((item.rate / 100) * 5)
}));
我知道它会更改每个对象 score
的值 items
。但是为什么会有...item
?
使用它有什么好处?
等于这个吗?:
return items.map(item => ({
item.score: Math.round((item.rate / 100) * 5);
return item;
}));
相当于
Array.prototype.map.call(items, function(item) {
return Object.assign({}, item, {
score: Math.round((item.rate / 100) * 5)
});
});
这种方法的想法是创建新数组,并为旧创建的每个项目创建一个包含旧的所有属性和分数的新对象 属性。如果 score
出现在项目上(旧数组的条目将被新对象覆盖)
这是传播运算符,基本上是函数在做什么,获取每个项目,将其映射到包含以下内容的对象:项目的完整克隆,以及分数
{ item, score }
虽然您建议的函数只会 return 带有添加属性的项目对象 score
,并且还会将该属性添加到原始 items
数组中的元素,如您正在修改引用的对象,而不是它的副本。
使用哪个?嗯,这取决于你的需要。
使用 spread operator is useful, if you want to create a shallow copy of the existing values, and update the object/array immutably.
扩展语法的一个常见用法是当您对 Angular 使用 Redux for React.js or NgRX 时。
对于您提供的代码,
return items.map(item => ({
...item,
score: Math.round((item.rate / 100) * 5)
}));
生成的数组将是 items
数组与原始 properties/values 数组的浅表副本,后跟每个对象中 score
属性 的更新值items
数组。
与之前的答案相似,请注意展开运算符将 item
的内容展开到另一个花括号中。
将 item
的内容浅层复制到新对象中,但替换为 score
的新值。
这是一个内存高效的复制过程,代码可读性非常好。它与您的建议相似。
它只是在那种情况下提供了更好的语法糖。如果仅出于此目的以及它的其他用例,我建议您考虑多使用点差运算符。