javascript - 克隆数组(不是引用副本)并修改新数组

标签 javascript arrays foreach

我认为我的问题很容易解决,但作为新手我无法到达那里。

const arr1 = [
  { department: "Lebensmittel", id: "id6", product: "Nudeln", status: false },
  { department: "Ceralien", id: "id5", product: "Marmelade", status: false },
  { department: "Ceralien", id: "id3", product: "Müsli", status: false },
  { department: "Ceralien", id: "id4", product: "Honig", status: false },
  { department: "Molkereiprodukte", id: "id1", product: "Milch", status: false }
];

let testArr = [...arr1];

testArr.forEach(obj => (obj.status = "test"));

console.log(arr1, testArr)
日志显示,forEach() 函数也应用于 arr1。为什么会这样,我如何才能保持 arr1 不可变?
arr1 = [
  { department: "Lebensmittel", id: "id6", product: "Nudeln", status: false },
  { department: "Ceralien", id: "id5", product: "Marmelade", status: false },
  { department: "Ceralien", id: "id3", product: "Müsli", status: false },
  { department: "Ceralien", id: "id4", product: "Honig", status: false },
  { department: "Molkereiprodukte", id: "id1", product: "Milch", status: false }
];

 testArr = [
  { department: "Lebensmittel", id: "id6", product: "Nudeln", status: false },
  { department: "Ceralien", id: "id5", product: "Marmelade", status: false },
  { department: "Ceralien", id: "id3", product: "Müsli", status: false },
  { department: "Ceralien", id: "id4", product: "Honig", status: false },
  { department: "Molkereiprodukte", id: "id1", product: "Milch", status: false }
];

最佳答案

arr1包含对象,所以只需克隆 arr1是不足够的。您需要克隆 arr1 中的对象也。
您可以使用 .map()函数和扩展运算符创建一个新数组,该数组包含 arr1 中对象的克隆。 .

const arr1 = [
  { department: "Lebensmittel", id: "id6", product: "Nudeln", status: false },
  { department: "Ceralien", id: "id5", product: "Marmelade", status: false },
  { department: "Ceralien", id: "id3", product: "Müsli", status: false },
  { department: "Ceralien", id: "id4", product: "Honig", status: false },
  { department: "Molkereiprodukte", id: "id1", product: "Milch", status: false }
];

let testArr = arr1.map(obj => ({...obj}));

testArr.forEach(obj => (obj.status = "test"));

console.log(arr1[0]);
console.log(testArr[0]);
.as-console-wrapper { max-height: 100% !important; top: 0; } 

使用 .map()函数还允许您更新返回的对象。所以你可以删除 forEach循环并使用 .map()函数不仅可以克隆对象,还可以更新 status克隆对象的属性。

const arr1 = [
  { department: "Lebensmittel", id: "id6", product: "Nudeln", status: false },
  { department: "Ceralien", id: "id5", product: "Marmelade", status: false },
  { department: "Ceralien", id: "id3", product: "Müsli", status: false },
  { department: "Ceralien", id: "id4", product: "Honig", status: false },
  { department: "Molkereiprodukte", id: "id1", product: "Milch", status: false }
];

let testArr = arr1.map(obj => ({...obj, status: 'test'}));

console.log(arr1[0]);
console.log(testArr[0]);
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - 克隆数组(不是引用副本)并修改新数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62861485/

相关文章:

javascript - 纯 CSS 下拉菜单真的可行吗?

java - 此标记后预期的表达式

javascript - 如果不实例化(new -'ing')它: var a = Array.prototype.slice.call(arguments),这怎么可能?

java - 如何优化算法以能够在java中确定10位长素数

c++ - 实现 Boost 范围适配器 reversed_if

php - 使用 file() 函数的 Foreach 连续循环。

c# - BackgroundWorker 在 foreach 循环期间从 DAL 返回值

javascript - 如何计算页面上具有值的输入总数?

javascript - 从 JavaScript 访问 Firebase

javascript - 铁路由器不等待 meteor.user() 返回