复制并更新数组值更新原始数组值 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>'
  );
}