javascript - 在 Nuxtjs 中使用 reduce 时源数据发生了变化
问题描述
我的代码:
export default {
data() {
return {
services: [],
mydata: [
{id: 1, count: 102, price: 0.1},
{id: 1, count: 0, price: 0.09},
{id: 2, count: 20, price: 0.5},
]
};
},
mounted() {
this.start();
},
methods: {
start() {
this.services = this.mydata.reduce((acc, curr) => {
let item = acc.find((obj) => obj.id == curr.id);
if (item) {
item.count += curr.count;
item.price = item.price > curr.price ? curr.price : item.price;
} else {
acc.push(curr);
}
return acc;
}, []);
},
},
};
我想合并mydata
数组并保存到一个services
变量中。我希望count
s 是总和,并且price
为新对象选择较低的值。(我曾经reduce
这样做过)
我的预期services
:
[
{id: 1, count: 102, price: 0.09},
{id: 2, count: 20, price: 0.5},
]
它有效,但源数据(即mydata
)被操纵并转换为:(第一个对象被price
操纵并转换为 0.09,之前是 0.1)
[
{id: 1, count: 102, price: 0.09},
{id: 1, count: 0, price: 0.09},
{id: 2, count: 20, price: 0.5}
]
为什么会这样?
解决方案
怎么了?
你实际上是在修改mydata
。
当您在数组中找到对象时会发生这种情况:
let item = acc.find((obj) => obj.id == curr.id);
然后修改它
item.count += curr.count;
item.price = item.price > curr.price ? curr.price : item.price;
为什么会发生?
在 JavaScript 中,我们有两种类型和数据类型。
- 原始类型 (
Boolean
,String
,Number
,null
,undefined
) 并且它们是按值传递的。 Array
,Function
并通过引用Object
传递
在您的情况下,您在数组中找到一些对象,然后修改其属性,这意味着您正在对引用进行操作。
怎么做?
- 如果您有原始类型数组,则可以使用例如扩展运算符进行浅拷贝:
let arr = ['a', 'b', 'c']
[...arr].reduce()
推荐阅读
- swift - Swift 中是否有一种方法可以停止由预定计时器定期运行的函数?
- c# - 如何使用 xslt 将嵌套的 Json 对象转换为 xml
- rust - 如何在不破坏 Rust 的情况下将枚举与参数匹配?
- gnuplot - gnuplot 为什么警告:字符串中的时间格式错误
- node.js - 使用 Multer 进行 React Hooks 和 Axios 图像上传
- android - 使用 Firebase 为 Facebook Auth 生成哈希键时出现 Multidex 错误
- javascript - Spotify - 搜索艺术家
- python - TypeError:“JpegImageFile”对象不可迭代
- python - 尝试在 mousepress 事件上使用来自另一个组合框的值加载自定义组合框
- python - 在 Pytorch 中使用枚举的 ValueError(HDF5 数据)