怎么能这个功能纯净

时间:2016-04-01 08:36:00

标签: javascript

我想映射一个数组,返回除.created属性之外的相同数组,我正在从毫秒转换为日期对象。

const posts = data.map((post) => {
    post.created = new Date(post.created); //milliseconds to Date Object
    return post;
})

这个函数做了我期望的结果,但我不喜欢因为里面的函数不纯,正在改变对象。 如何用纯函数做同样的替代方法?

非常感谢你。

3 个答案:

答案 0 :(得分:2)

您可以使用Object.assign中的map docs来实现此目的:

const posts = data.map((post) => {
    return Object.assign({}, post, { created: new Date(post.created) });
})

这实质上克隆了原始post,然后覆盖了created属性。

答案 1 :(得分:1)

我会提供两种解决方案。

克隆数组及其对象

data.map(post => Object.assign({created: new Date(post.created)},post));

Object.assign的第一个参数是target对象。它也是Object.assign返回的对象。

修改现有阵列

for(let post of data){
    post.created = new Date(post.created); 
}

当然,这种方法更快,成本更低,因为它不需要初始化一个新数组,然后它的对象就像另一个那样复制所有对象的属性。

选择权在你手中。只要确保你知道你在做什么。

答案 2 :(得分:1)

您可以复制而不复制旧对象的所有属性:

const posts = data.map((post) => { 
    const obj = Object.create(post); 
    obj.created = new Date(post.created); // shadow created with the new value
    return obj;
});

在实践中,它使用JavaScript继承方案,以便新对象只有created作为自己的属性,其余的继承自原始对象。