我对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(不包括)之间的视图。(如果