复制并更新数组值更新原始数组值 javascript
Copy and update array value updates original array value javascript
我有两个数组。一个是空白的,另一个是有数据的。我随机挑选候选人并将它们粘贴到我的空白数组中。
因为我已经选择了那些候选人,所以我不想再次选择他们的名字,也不想失去他们在原始数组中的索引位置。为了避免再次选择,我设置了 name = undefined。现在发生的是我的重复数组也更新为未定义。
如果您 运行 下面的代码,切换下面的行并检查 selectedcandidates 数组,它将提供更好的信息。
candidates[candidateIndex[i]].name= undefined;
如何将元素复制到其他数组并更新原始数组,而不影响预先复制的 array.Thanks。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<button onclick="selectCandidate()">Click Here !!!</button> <script>
var selectedCandidate=[];
var candidates = [
{name:"Alpha",
age:"21"
},
{name:"Beta",
age:"21"
},
{name:"Gamma",
age:"21"
},
{name:"Albert",
age:"21"
},
{name:"Alaks",
age:"21"
},
{
age:"21"
},
{
age:"21"
}
];
function selectCandidate(){
var candidateIndex = [];
for(i =0; i<2; i++){
var randomnumber = generateRandomNumber();
if(candidateIndex.indexOf(randomnumber) && candidates[randomnumber].name != undefined){
candidateIndex.push(randomnumber);
}
else{
i--;
}
}
var selectthiscandidate;
for(i=0; i< 2; i++){
selectthiscandidate = candidates[candidateIndex[i]];
selectedCandidate.push(selectthiscandidate);
candidates[candidateIndex[i]].name= undefined;
}
console.log(selectedCandidate);
console.log(candidates);
}
function generateRandomNumber(){
return Math.floor((Math.random() * candidates.length-1) + 1);
}
</script>
</body>
</html>
您的问题与线路有关
selectedCandidate.push(selectthiscandidate);
因为它将对对象的引用推送到 selectedCandidate 数组中,而不是对象的克隆。要解决这个问题,只需克隆对象。您可以使用像 jQuery ($.extend) 这样的库或使用纯 JavaScript 和 JSON 对象来做到这一点。所以你的行应该是这样的:
selectedCandidate.push(JSON.parse(JSON.stringify(selectthiscandidate)));
希望对您有所帮助 ;)
根据@MysterX 指南更改了我的代码并且它有效。感谢@MysterX
for(i=0; i< 2; i++){
selectthiscandidate ={};
selectthiscandidate ={name:candidates[candidateIndex[i]].name,age:candidates[candidateIndex[i]].age}
selectedCandidate.push(selectthiscandidate);
candidates[candidateIndex[i]].name= undefined;
}
以下代码从原始数组中完全删除对象(多次按 "Run code snippet" 以打印不同的结果):
var candidates = [{
name: "Alpha",
age: "21"
}, {
name: "Beta",
age: "21"
}, {
name: "Gamma",
age: "21"
}];
document.write('<p>"candidates" before selection:</p>');
print(candidates);
document.write('<p>Selection (returns a new array):</p>');
print(selectSome(candidates, 2));
document.write('<p>"candidates" after selection:</p>');
print(candidates);
function selectSome (source, n) {
var i = 0;
var total = source.length;
var selected = new Array(n);
while (i < n) {
selected[i++] = selectOne(
source, Math.floor(
Math.random() * total
)
);
}
return selected;
}
function selectOne (source, i) {
if (source[i] === null) {
// already selected, retry with i + 1
return selectOne(source, ++i % source.length);
}
else {
// candidate found, replace it with null and return it
return source.splice(i, 1, null)[0];
}
}
function print (o) {
document.write(
'<pre>' + JSON.stringify(o) + '</pre>'
);
}
我有两个数组。一个是空白的,另一个是有数据的。我随机挑选候选人并将它们粘贴到我的空白数组中。
因为我已经选择了那些候选人,所以我不想再次选择他们的名字,也不想失去他们在原始数组中的索引位置。为了避免再次选择,我设置了 name = undefined。现在发生的是我的重复数组也更新为未定义。
如果您 运行 下面的代码,切换下面的行并检查 selectedcandidates 数组,它将提供更好的信息。
candidates[candidateIndex[i]].name= undefined;
如何将元素复制到其他数组并更新原始数组,而不影响预先复制的 array.Thanks。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<button onclick="selectCandidate()">Click Here !!!</button> <script>
var selectedCandidate=[];
var candidates = [
{name:"Alpha",
age:"21"
},
{name:"Beta",
age:"21"
},
{name:"Gamma",
age:"21"
},
{name:"Albert",
age:"21"
},
{name:"Alaks",
age:"21"
},
{
age:"21"
},
{
age:"21"
}
];
function selectCandidate(){
var candidateIndex = [];
for(i =0; i<2; i++){
var randomnumber = generateRandomNumber();
if(candidateIndex.indexOf(randomnumber) && candidates[randomnumber].name != undefined){
candidateIndex.push(randomnumber);
}
else{
i--;
}
}
var selectthiscandidate;
for(i=0; i< 2; i++){
selectthiscandidate = candidates[candidateIndex[i]];
selectedCandidate.push(selectthiscandidate);
candidates[candidateIndex[i]].name= undefined;
}
console.log(selectedCandidate);
console.log(candidates);
}
function generateRandomNumber(){
return Math.floor((Math.random() * candidates.length-1) + 1);
}
</script>
</body>
</html>
您的问题与线路有关
selectedCandidate.push(selectthiscandidate);
因为它将对对象的引用推送到 selectedCandidate 数组中,而不是对象的克隆。要解决这个问题,只需克隆对象。您可以使用像 jQuery ($.extend) 这样的库或使用纯 JavaScript 和 JSON 对象来做到这一点。所以你的行应该是这样的:
selectedCandidate.push(JSON.parse(JSON.stringify(selectthiscandidate)));
希望对您有所帮助 ;)
根据@MysterX 指南更改了我的代码并且它有效。感谢@MysterX
for(i=0; i< 2; i++){
selectthiscandidate ={};
selectthiscandidate ={name:candidates[candidateIndex[i]].name,age:candidates[candidateIndex[i]].age}
selectedCandidate.push(selectthiscandidate);
candidates[candidateIndex[i]].name= undefined;
}
以下代码从原始数组中完全删除对象(多次按 "Run code snippet" 以打印不同的结果):
var candidates = [{
name: "Alpha",
age: "21"
}, {
name: "Beta",
age: "21"
}, {
name: "Gamma",
age: "21"
}];
document.write('<p>"candidates" before selection:</p>');
print(candidates);
document.write('<p>Selection (returns a new array):</p>');
print(selectSome(candidates, 2));
document.write('<p>"candidates" after selection:</p>');
print(candidates);
function selectSome (source, n) {
var i = 0;
var total = source.length;
var selected = new Array(n);
while (i < n) {
selected[i++] = selectOne(
source, Math.floor(
Math.random() * total
)
);
}
return selected;
}
function selectOne (source, i) {
if (source[i] === null) {
// already selected, retry with i + 1
return selectOne(source, ++i % source.length);
}
else {
// candidate found, replace it with null and return it
return source.splice(i, 1, null)[0];
}
}
function print (o) {
document.write(
'<pre>' + JSON.stringify(o) + '</pre>'
);
}