ES6中如何为对象数组内所有对象的指定键设置新值?
在ES6中批量更新对象数组的指定键值
当然有办法啦!针对你给出的场景,ES6里有几种非常实用的方式可以把数组里所有对象的published属性统一设为true,我给你详细说说:
方法一:直接修改原数组(使用forEach)
如果你不需要保留原数组的原始状态,想用最直接的方式修改数组里的对象,forEach是个不错的选择。因为数组里的对象是引用类型,forEach遍历的时候直接修改属性就会同步到原数组里:
const posts = [ {title: 'my title', published: false}, {title: 'news', published: true} ]; // 遍历每个对象,把published设为true posts.forEach(post => { post.published = true; });
执行完之后,原数组posts里的所有对象的published都会变成true。
方法二:生成新数组(使用map + 扩展运算符)
要是你想保留原数组不动,生成一个全新的数组来存放更新后的对象,那ES6的map配合对象扩展运算符...就很合适。这种方式不会修改原数据,更符合函数式编程的理念:
const posts = [ {title: 'my title', published: false}, {title: 'news', published: true} ]; // 生成新数组,每个对象是原对象的副本并更新published const updatedPosts = posts.map(post => ({ ...post, // 复制原对象的所有属性 published: true // 覆盖published属性的值 }));
这里的扩展运算符会把原对象的所有属性复制到新对象里,然后我们再指定published: true来覆盖原来的值,这样原数组posts完全不受影响,新数组updatedPosts里的对象都是更新后的状态。
补充:用Object.assign替代扩展运算符
如果你更习惯用Object.assign的写法,也能达到同样的效果(和扩展运算符作用类似,都是复制对象属性):
const updatedPosts = posts.map(post => Object.assign({}, post, { published: true }));
不过在ES6及以后的版本里,扩展运算符的写法会更简洁直观一些。
内容的提问来源于stack exchange,提问作者panthro
相关产品推荐
相关产品推荐

