当前位置: 首页 > 面试题库 >

为什么数组上的js映射会修改原始数组?

饶骁
2023-03-14
问题内容

我对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()的文档说不应这样做(https://developer.mozilla.org/en-
US/docs/Web/JavaScript/Reference/Global_Objects/Array/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"
    };
  });
};


 类似资料:
  • 为什么这里两个列表的大小都是零?按照我的理解,< code>aList1.size()应该是< code>0,而< code>aList2.size()应该是< code>1。

  • 我在使用Ruby数组时遇到了一些意外的行为: 终端输出: 第一个问题:为什么array1和array2中的项目不同,尽管只在array3上迭代?连接两个数组会返回一个新数组,那么为什么array1和array2会有延迟效应呢? 第二个问题:如何通过迭代来更改array3中的项目,而不更改项目array1或array2? 第三个问题:当使用. map和. each代替. map!时,输出是相同的。所

  • 我正在C中实现合并排序。我有一个合并函数-和一个mergeSort函数-。 如果对原始数组的前半部分和后半部分进行排序(例如:),则合并排序可以很好地工作。这是因为我的merge函数无论在什么情况下都要传递原始数组,并且当它被赋予2个排序数组时(正如预期的那样),它可以工作。我的问题是他们什么时候不是。每次调用merge时,我的原始数组都没有被修改,尽管我已经对它进行了编程。有人能知道我的问题在哪

  • 谁能给我解释一下,当我改变从find函数返回的值时,为什么原始数组中的值会改变呢?是不是有一个我缺失的概念?在执行代码之后,我将得到下面提到的输出。

  • 考虑: 为什么改变的值会改变的值?

  • 问题内容: 我知道在Java中通过引用传递它们时,它们是可变的。 我想确切知道它的原始列表和子列表的内存地址中发生了什么。 子列表和原始列表是否引用相同的对象? 以下是反映从子列表到主原始列表所做更改的代码示例。 问题答案: 根据此事: 列表subList(int fromIndex,int toIndex) 返回此列表中指定的fromIndex(包括)和toIndex(不包括)之间的视图。(如果