Comment écrire ces fonctions (fonctionnelles) à l'aide des méthodes 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);
    }
}

Ma tentative était la suivante:

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

Qui, se comporte différemment, en ce que peaks n'est jamais correctement créé. Le javascripteur averti reconnaîtra sans aucun doute que j'essaie de jslint.com mon code.

La méthode Peak() (par souci de concision) est simplement :

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

Ce qui donne?

1
Jamie 18 mars 2019 à 22:09

2 réponses

Meilleure réponse

forEach parcourt simplement une liste mais ne renvoie rien. Utilisez donc map à la place et renvoyez l'objet nouvellement créé.

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

Un autre problème est que peaks n'est pas disponible en dehors de la portée de loadAudioMeterHistory. Faites donc en sorte que la fonction renvoie ce qui peut être transmis au prochain appel de fonction.

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);
  });
}
2
Sushanth -- 18 mars 2019 à 19:18