为什么一个数组上的js映射会修改原来的数组?

编程入门 行业动态 更新时间:2024-10-06 16:18:42

为什么一个<a href=https://www.elefans.com/category/jswz/34/1771288.html style=数组上的js映射会修改原来的数组?"/>

为什么一个数组上的js映射会修改原来的数组?

我对 map() 的行为很困惑。

我有一个像这样的对象数组:

const products = [{
    ...,
    'productType' = 'premium',
    ...
}, ...]

我将这个数组传递给一个函数,该函数应该返回相同的数组但所有产品都是免费的:

[{
    ...,
    'productType' = 'free',
    ...
}, ...]

函数是:

const freeProduct = function(products){
    return products.map(x => x.productType = "free")
}

返回以下数组:

["free", "free", ...]

所以我将函数重写为:

const freeProduct = function(products){
    return products.map(x => {x.productType = "free"; return x})
}

按预期返回数组。

但是!这就是我失去理智的那一刻,在这两种情况下,我的原始产品数组都被修改了。

有关 map() 的文档说它不应该()。

我什至尝试创建一个数组的克隆,将我的函数变成这样:

const freeProduct = function(products){
    p = products.splice()
    return p.map(x => {x.productType = "free"; return x})
}

但我仍然得到相同的结果(这开始让我发疯)。

我会非常感谢任何能解释我做错了什么的人!

谢谢。

回答如下:

您没有修改原始数组。您正在修改数组中的对象。如果你想避免改变数组中的对象,你可以使用

Object.assign
来创建一个新的对象,它具有原始的属性加上你需要的任何更改:

const freeProduct = function(products) {
  return products.map(x => {
    return Object.assign({}, x, {
      productType: "free"
    });
  });
};

2018编辑:

在大多数浏览器中,您现在可以使用对象传播语法代替

Object.assign
来完成此操作:

const freeProduct = function(products) {
  return products.map(x => {
    return {
      ...x,
      productType: "free"
    };
  });
};

更多推荐

为什么一个数组上的js映射会修改原来的数组?

本文发布于:2024-05-13 14:46:39,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1759713.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:数组   js

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!