2015-09-13 98 views
-2

我有两个数组。一个是空白的,另一个是数据。我选择随机候选人并将其粘贴到我的空白数组中。复制并更新数组值更新原始数组值javascript

由于我已经选择了这些候选人,我不希望他们的名字再次被选中,以及我不想松开他们在原始数组中的索引位置。为了避免再次选择,我设置了name = undefined。现在发生什么是我的重复数组也更新为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> 
+0

你推送到'selectedCandidate'只是从'candidate'中引用原始对象 – MysterX

+0

与[克隆对象的最有效方法是什么]相关?(http://stackoverflow.com/questions/122102/what-is-the - 大多数高效的路-to-clone-an-object) –

+0

@MysterX对我或者答案是一个问题。对不起,不明白。 –

回答

0

你的问题是与线

selectedCandidate.push(selectthiscandidate); 

,因为它推动selectedCandidate阵列,而不是对象的克隆内的对象的引用。为了解决这个问题,简单地克隆对象。你可以使用像jQuery($ .extend)这样的库,或者使用纯JavaScript和JSON对象。所以,你的行应该是这样的:

selectedCandidate.push(JSON.parse(JSON.stringify(selectthiscandidate))); 

希望帮助;)

+0

简单的一行代码。真棒。谢谢。 –

0

我的代码更改为每@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;  
      } 
0

下面的代码从原始阵列完全移除所述对象(按“运行代码段”多次打印不同的结果):

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>' 
 
); 
 
}