2015-09-13 166 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>' 
 
); 
 
}