javascript - 添加到一个数组会导致在 javascript 中添加另一个数组,反之亦然
问题描述
我在这段代码中有一组从不同的函数构造函数创建的数组:
// The general purpose of a set is to make sure that it's elements are unique
function SetJs() {
collection = [];
this.has = (value) => {
return collection.indexOf(value) !== -1;
}
this.add = (value) => {
if (!this.has(value)) {
collection.push(value);
return `${value} added to set`;
} else {
return `${value} already part of set`;
}
}
this.delete = (value) => {
if (this.has(value)) {
collection.splice(collection.indexOf(value), 1)
return `${value} removed from set`;
} else {
return `${value} not found in set`;
}
}
this.set = () => {
return collection;
}
this.length = () => {
return collection.length;
}
}
var set1 = new SetJs();
var set2 = new SetJs();
let result;
const getSetByNumber = (setNumber) => {
if (setNumber === 1) {
return set1;
} else {
return set2;
}
}
const addToSet = (setNumber) => {
let set = getSetByNumber(setNumber);
result = set.add(document.getElementById('input').value);
printSet();
}
const deleteFromSet = (setNumber) => {
let set = getSetByNumber(setNumber);
result = set.delete(document.getElementById('input').value);
printSet();
}
const printSet = () => {
document.getElementById('result').innerHTML = result;
document.getElementById('set1').innerHTML = JSON.stringify(set1.set());
document.getElementById('set2').innerHTML = JSON.stringify(set2.set());
}
<h1>
Set implementation in javascript
</h1>
<label id="result"></label>
<br/>
<input id="input" placeholder="Enter a value" />
<button onClick="addToSet(1)">Add to set 1</button>
<button onClick="deleteFromSet(1)">Delete from set 1</button>
<button onClick="addToSet(2)">Add to set 2</button>
<button onClick="deleteFromSet(2)">Delete from set 2</button>
<br/> Set 1:
<div id="set1"></div>
Set 2:
<div id="set2"></div>
set1
&set2
是不同的集合对象。但是,当我添加一个时,另一个也会更新。
为什么 Set 1 和 Set 2 会同时更新?
这里有什么问题?
解决方案
当您不定义范围时,它被视为全局范围变量。您需要将您的定义collection
为该函数中的范围。
// The general purpose of a set is to make sure that it's elements are unique
function SetJs() {
let collection = [];
this.has = (value) => {
return collection.indexOf(value) !== -1;
}
this.add = (value) => {
if (!this.has(value)) {
collection.push(value);
return `${value} added to set`;
} else {
return `${value} already part of set`;
}
}
this.delete = (value) =>
collection = collection.filter(item => item !== value);
this.set = () => collection;
this.length = () => collection.length;
}
var set1 = new SetJs();
var set2 = new SetJs();
let result;
const getSetByNumber = (setNumber) => {
if (setNumber === 1) {
return set1;
} else {
return set2;
}
}
const addToSet = (setNumber) => {
let set = getSetByNumber(setNumber);
result = set.add(document.getElementById('input').value);
printSet();
}
const deleteFromSet = (setNumber) => {
let set = getSetByNumber(setNumber);
result = set.delete(document.getElementById('input').value);
printSet();
}
const printSet = () => {
document.getElementById('result').innerHTML = result;
document.getElementById('set1').innerHTML = JSON.stringify(set1.set());
document.getElementById('set2').innerHTML = JSON.stringify(set2.set());
}
<h1>
Set implementation in javascript
</h1>
<label id="result"></label>
<br/>
<input id="input" placeholder="Enter a value" />
<button onClick="addToSet(1)">Add to set 1</button>
<button onClick="deleteFromSet(1)">Delete from set 1</button>
<button onClick="addToSet(2)">Add to set 2</button>
<button onClick="deleteFromSet(2)">Delete from set 2</button>
<br/> Set 1:
<div id="set1"></div>
Set 2:
<div id="set2"></div>
推荐阅读
- ruby - 如何从另一个内部类正确访问一个内部类中的实例变量?
- javascript - 将新元素添加到 firebase-database 时,附加表中的元素总是重复的
- javascript - 需要使用 react-redux 更新无状态组件的状态
- node.js - create-react-app 构建过程耗时太长
- java - 如何使用 MediaPlayer 开始活动
- sql-server - 将 Azure 上的 UTC 转换为 EST 时间(包括夏令时动态版本)
- python - Want to find contours -> ValueError: not enough values to unpack (expected 3, got 2),出现这个
- android - 在 react-native-map 中切换 maptype
- node.js - 有什么东西可以跟踪我安装的 npm 包并在不同的开发环境中恢复它们吗?(如“恢复 NuGet 包”)
- asterisk - 如何在 Asterisk 15 中制作 H.323 中继