map() 函数是这种情况下的最佳选择
tl;dr - 这样做:
const newArr = [
{name: 'eve'},
{name: 'john'},
{name: 'jane'}
].map(v => ({...v, isActive: true}))
map() 函数不会修改初始数组,而是创建一个新数组。
这也是保持初始数组不变的好习惯。
替代方案:
const initialArr = [
{name: 'eve'},
{name: 'john'},
{name: 'jane'}
]
const newArr1 = initialArr.map(v => ({...v, isActive: true}))
const newArr2 = initialArr.map(v => Object.assign(v, {isActive: true}))
// Results of newArr1 and newArr2 are the same
有条件地添加键值对
const arr = [{value: 1}, {value: 1}, {value: 2}]
const newArr1 = arr.map(v => ({...v, isActive: v.value > 1}))
如果条件为假,我根本不想添加新字段怎么办?
const arr = [{value: 1}, {value: 1}, {value: 2}]
const newArr = arr.map(v => {
return v.value > 1 ? {...v, isActive: true} : v
})
添加WITH对初始数组的修改
const initialArr = [{a: 1}, {b: 2}]
initialArr.forEach(v => {v.isActive = true;});
这可能不是一个最好的主意,但在现实生活中,有时这是唯一的方法。
问题
- 我应该使用扩展运算符 (
...) 还是 Object.assign,有什么区别?
我个人更喜欢使用扩展运算符,因为我认为它在现代 Web 社区中的使用范围更广(尤其是 React 的开发人员喜欢它)。但是您可以自己检查差异:link(有点固执和陈旧,但仍然)
- 我可以使用
function 关键字代替 => 吗?
当然可以。粗箭头 (=>) 函数与 this 的作用略有不同,但对于这种特殊情况来说并不那么重要。但是胖箭头的功能更短,有时作为回调更好。因此使用粗箭头函数是更现代的方法。
- 地图函数内部实际发生了什么:
.map(v => ({...v, isActive: true})?
Map 函数按数组元素进行迭代,并为每个元素应用回调函数。该回调函数应返回将成为新数组元素的内容。
我们告诉.map() 函数如下:获取当前值(v 这是一个对象),从v 中取出所有键值对并将其放入一个新对象({...v})中,但还要添加属性isActive 并将其设置为 true ({...v, isActive: true}) 然后返回结果。顺便说一句,如果原始对象包含 isActive 归档,它将被覆盖。 Object.assign 的工作方式类似。
是的。
[{value: 1}, {value: 1}, {value: 2}].map(v => ({...v, isActive: true, howAreYou: 'good'}))
你不应该做任何副作用[link 1,link 2],但显然你可以。
还要注意map() 遍历数组的每个元素并为每个元素应用函数。所以如果你在里面做一些沉重的事情,你可能会很慢。这个(有点老套)solution 在某些情况下可能会更有效率(但我认为您一生中不应多次应用它)。
当然可以。
const arr = [{value: 1}, {value: 1}, {value: 2}]
const newArr = arr.map(addIsActive)
function addIsActive(v) {
return {...v, isActive: true}
}
for 没有任何问题,您仍然可以使用它,它只是一种更冗长、更不安全并且会改变初始数组的老式方法。不过你可以试试:
const arr = [{a: 1}, {b: 2}]
for (let i = 0; i < arr.length; i++) {
arr[i].isActive = true
}
很好地学习以下方法map()、filter()、reduce()、forEach() 和find() 将是明智之举。这些方法可以解决 80% 的你通常想用数组做的事情。