2015-09-13 5 views
-2

У меня есть два массива. Один пустой, другой - с данными. Я выбираю случайных кандидатов и вставляю их в свой пустой массив.Копировать и обновлять значения массива значения исходного значения массива javascript

Как я уже выбрал этих кандидатов, я не хочу, чтобы их имя было выбрано снова, а также я не хочу потерять свою позицию индекса в исходном массиве. Чтобы избежать повторного набора, я устанавливаю name = undefined. Теперь случается, что мой дублированный массив также обновляется с неопределенным.

, если вы запустите приведенный ниже код, переключитесь под строку и проверьте выбранный массив candidates, он даст лучшую информацию.

candidates[candidateIndex[i]].name= undefined; 

Как скопировать элемент в другой массив и обновить исходный массив, не затрагивая скопированный массив. Спасибо заранее.

<!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» только ссылку на исходный объект из «кандидатов» – 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>' 
 
); 
 
}

Смежные вопросы