Как я могу написать эти функции, чтобы использовать оператор forEach ()? - PullRequest
1 голос
/ 18 марта 2019

Как можно написать эти (рабочие) функции, используя forEach() методы:

function loadAudioMeterHistory(cell) {
    var peaks = new Array(4);

    for (var i = 0; i < peaks.length; i++) {
        var peak,
            age;

        peak = cell.getAttribute("data-peak-" + i);
        age  = cell.getAttribute("data-age-" + i);

        peaks[i] = new Peak(peak, age);
    }

    return peaks;
}
function setAudioMeterHistory(cell, peaks) {
    for (var i = 0; i < peaks.length; i++) {
        cell.setAttribute("data-peak-" + i, peaks[i].peak);
        cell.setAttribute("data-age-" + i,  peaks[i].age);
    }
}

Моя попытка была следующей:

function loadAudioMeterHistory(cell) {
    "use strict";
    var peaks = new Array(4);

    peaks.forEach(function(item, index) {
        var p = cell.getAttribute("data-peak-" + index);
        var a = cell.getAttribute("data-age-" + index);

        item = new Peak(p, a);
    });

    return peaks;
}
function setAudioMeterHistory(cell, peaks) {
    "use strict";
    peaks.forEach(function(item, index) {
        cell.setAttribute("data-peak-" + index, item.peak);
        cell.setAttribute("data-age-"  + index, item.age);
    });
}

, которая ведет себя по-другому, в этом peaks никогда не создается должным образом.Опытный javascripter, несомненно, поймет, что я пытаюсь jslint.com мой код.

Метод Peak() (для краткости) просто:

function Peak(peak, age) {
    this.peak = peak;
    this.age  = age;
}

Что дает?

Ответы [ 2 ]

2 голосов
/ 18 марта 2019

forEach просто перебирает список, но ничего не возвращает.Поэтому вместо этого используйте map и верните вновь созданный объект.

function loadAudioMeterHistory(cell) {
  "use strict";

  var peaks = [0, 1, 2, 3].map(function(item, index) {
    var p = cell.getAttribute("data-peak-" + index);
    var a = cell.getAttribute("data-age-" + index);

    return new Peak(p, a);
  });
}

Еще одна проблема заключается в том, что peaks недоступен вне области действия loadAudioMeterHistory.Так что пусть функция возвращает то, что может быть передано в следующий вызов функции.

function loadAudioMeterHistory(cell) {
  "use strict";

  return [0, 1, 2, 3].map(function(item, index) {
    var p = cell.getAttribute("data-peak-" + index);
    var a = cell.getAttribute("data-age-" + index);

    return new Peak(p, a);
  });
}

function setAudioMeterHistory(cell) {
  "use strict";

  var peaks = loadAudioMeterHistory(cell);

  peaks.forEach(function(item, index) {
    cell.setAttribute("data-peak-" + index, item.peak);
    cell.setAttribute("data-age-" + index, item.age);
  });
}
0 голосов
/ 18 марта 2019

Вы можете использовать Array.from () , второй аргумент которого является функцией для заполнения массива:

function loadAudioMeterHistory(cell) {
  return Array.from({ length: 4 }, (_, i) => {
    const peak = cell.getAttribute('data-peak-' + i);
    const age  = cell.getAttribute('data-age-' + i);
    return new Peak(peak, age);
  });
}

Для второй функции используйте forEach () следующим образом:

function setAudioMeterHistory(cell, peaks) {
  peaks.forEach(({ peak, age }) => {
    cell.setAttribute('date-peak-' + i, peak);
    cell.setAttribute('data-age-' + i, age);
  });
}
...