Как обновить значения объекта переменными массива?(JavaScript) - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть переменная объекта, хранящая значения гистограммы, и кнопка для обновления этих значений:

 var config = {
       type: 'bar',
       data: {
       datasets: [{
       type: 'bar', label: 'Dataset 1',
       data: [0, 0, 0, 0, 0, 0, 0,       
              0, 0, 0, 0, 0, 0,
              0, 0, 0, 0, 0, 0]}]}};
                                        
document.getElementById('add5').addEventListener('click', function() {
 tnow = moment().format('HH');
 switch (tnow) {
    case'8':  config.data.datasets[0].data[0]  += 5; break;
    case'9':  config.data.datasets[0].data[1]  += 5; break;
    // ...
    case'23': config.data.datasets[0].data[15] += 5; break;
    case'24': config.data.datasets[0].data[16] += 5; break;
    default: alert('doot');}
 window.myLine.update()});
   <button id="add5">+5</button>

Я пытаюсь сохранить указатель значения в качестве переменной, чтобы сократить код.Попытка

var h = [];
var h = config.data.datasets[0].data.slice();

, но

case '23': h[15] += 5; break;

не обновляет значение гистограммы.Однако alert(h[15]) возвращает точное значение диаграммы.

Как обновить значения диаграммы с помощью переменных массива?


ПОЛНЫЙ КОНТЕКСТ:

Использование moment.js и chart.js для создания гистограммы, которая обновляет значение в соответствии с часами реального времени.Пример: если сейчас 7:30 вечера, нажатие «+5» добавит 5 к панели, расположенной в 7 вечера.case '8' = 8 утра, case '23' = 11 вечера и т. Д. Я намереваюсь добавить второй набор данных, который отображается, когда значения превышают 60, используя if, чтобы изменить значение второго набора данных (включая config.data … в два раза больше - делаякод довольно длинный).

1 Ответ

0 голосов
/ 12 сентября 2018

Когда вы используете slice():

var h = config.data.datasets[0].data.slice();

, вы делаете копию из config.data.datasets[0].data.Затем вы изменяете эту копию в своем коде, но это не влияет на гистограмму, поскольку она не меняет исходные данные:

let datasets = [{
    data: [1, 2, 3, 4, 5, 6]
}]
let h = datasets[0].data.slice()

h[0] ="What?"
console.log(h)                      // h has changed
console.log(datasets[0].data)       // original data is unchanged

console.log(h === datasets[0].data) // because they are not the same array

Если вы хотите сократить свой код, просто возьмите ссылку на массив без slice():

var h = config.data.datasets[0].data

let datasets = [{
    data: [1, 2, 3, 4, 5, 6]
}]
let h = datasets[0].data

h[0] ="What?"
console.log(h)                      // h has changed
console.log(datasets[0].data)       // original data is also chaged

console.log(h === datasets[0].data) // because they ARE the same array
...