javascript - 使用 Javascript .find() 似乎做了一些奇怪的强制,我似乎无法确定
问题描述
我正在尝试收集所有对象DATA
并与schemesFromPOI
. 如果名称是AMERICAN_EXPRESS,我只想在scheme
对象中将其更改为AMEX,保留DATA
对象。
const DATA =
[
{
"name": "MASTERCARD",
"id": "MASTERCARD123"
},
{
"name": "VISA",
"id": "VISA456"
},
{
"name": "AMERICAN_EXPRESS",
"id": "AMEX789"
}
];
const schemesFromPOI = [
{ dpaId: 'DPA1', name: 'MASTERCARD' },
{ dpaId: 'DPA2', name: 'VISA' },
{ name: 'AMERICAN_EXPRESS' }
];
let config = [];
schemesFromPOI.forEach(function (schemeFromPOI) {
let scheme = DATA.find(function (element) { return element.name === schemeFromPOI.name; });
if(scheme) {
if (scheme.name === "AMERICAN_EXPRESS") {
console.log("Before updating scheme.name property: ", DATA);
scheme.name = 'AMEX';
console.log("After updating scheme.name property: ", DATA);
}
config.push(scheme);
}
});
但是,当我更改时scheme.name
,DATA
对象也会更新。以下是上述控制台输出的结果:
Before updating scheme.name property: "[{'name':'MASTERCARD','id':'MASTERCARD123'},{'name':'VISA','id':'VISA456'},{'name':'AMERICAN_EXPRESS','id':'AMEX789'}]"
After updating scheme.name property: "[{'name':'MASTERCARD','id':'MASTERCARD123'},{'name':'VISA','id':'VISA456'},{'name':'AMEX','id':'AMEX789'}]"
显然,DATA
对象正在更新,而不仅仅是scheme
对象。为什么会发生这种强制?跟.find()
方法有关系吗?
解决方案
这是因为数组是引用类型。因此,当您在编辑时scheme.name = 'AMEX';
,这意味着scheme.name
将被更改并且在 中找到的对象DATA
。
如果要创建一个全新的对象,请使用扩展...
运算符:
const data = [
{ name: "John", age: "22", weight: "60", height: "180cm" },
{ name: "Emma", age: "25", weight: "55", height: "160cm" }
];
let obj = data.find(f=> f.name =='John');
let brandNewObject = {...obj};
一个例子:
const data = [
{ name: "John", age: "22", weight: "60", height: "180cm" },
{ name: "Emma", age: "25", weight: "55", height: "160cm" }
];
let obj = data.find(f=> f.name =='John');
let brandNewObject = {...obj};
brandNewObject .name = "Joseph";
console.log(`obj`, obj);
console.log(`brandNewObject `, brandNewObject );
推荐阅读
- c++ - Windows.Media.Audio.AudioGraph 中的延迟输入
- html - 具有固定页眉、页脚和侧面板的响应式三列布局
- mysql - 如果关系不为空,Laravel 雄辩的 where 子句
- oracle - 从 oracle 数据库中检索和显示数据
- regex - Sed(OS X)用其他文本块替换包含给定字符串的文本块
- javascript - 如何在 Firestore 中查询集合并将文档聚合为“每天”、“每周”?
- azure-ad-b2c - Azure AD B2C - 为社交/联合用户禁用/阻止登录
- postgresql - 带有弹簧靴和 postgres 的 PgBouncer
- r - @title 第 1 行缺少名称
- google-sheets - 获取列的最高值 - Google 表格