【问题标题】:Removing unnecessary duplication删除不必要的重复
【发布时间】:2019-05-07 02:55:36
【问题描述】:

我正在尝试从默认设置中删除这些 playerVars,因为这是不必要的重复。

    start: 0,
    end: 999999,
    loop: true,

https://jsfiddle.net/hzyrfkwb/461/

  function addVideo(video, settings) {
      const defaultSettings = {
              width: settings.width || 640,
              height: settings.height || 390,
              videoId: video.dataset.id,
              playerVars: {
                  start: 0,
                  end: 999999,
                  loop: true,

有没有办法让我只在需要时才添加它们?

正如本例中所做的那样:

https://jsfiddle.net/hzyrfkwb/432/

这样做会消除很多不必要的重复。

 loadPlayer({
        target: ".jacketc",
        width: 600,
        height: 338,
        playerVars: {
            start: 200,
            end: 205,
            loop: true
        }
    });

上面两个都不需要说明:

  function addVideo(video, settings) {
 const defaultSettings = {
         width: settings.width || 640,
         height: settings.height || 390,
         videoId: video.dataset.id,
         playerVars: {
             start: 0,
             end: 999999,
             loop: true

还有底部:

loadPlayer({
    target: ".jacketc",
    width: 600,
    height: 338,
    playerVars: {
        start: 200,
        end: 205,
        loop: true
    }
});

只有在需要时才应将它们添加到 loadPlayer。 在默认设置中不应要求它们位于顶部。

start: 0,
end: 999999,
loop: true,

这些应该只是默认设置:

     autoplay: 1,
     controls: 1,
     showinfo: 1,
     rel: 0,
     iv_load_policy: 3,
     cc_load_policy: 0,
     fs: 0,
     disablekb: 1
 };

只有在需要时才会将它们添加到 loadPlayer。 如果不需要它们,则不需要出现在 javascript 中。

    start: 0,
    end: 999999,
    loop: true,

我如何才能对代码进行这种调整?

https://jsfiddle.net/hzyrfkwb/453/

默认设置中不需要这些 playerVar。 只有在需要时才会将它们添加到 loadPlayer。

        start: 200,
        end: 205,
        loop: true,

这正是它在其他代码中的工作方式。

https://jsfiddle.net/hzyrfkwb/465/

如何在新的更新代码中实现这一点?

https://jsfiddle.net/hzyrfkwb/453/

【问题讨论】:

    标签: javascript duplicates youtube-api youtube-javascript-api


    【解决方案1】:

    我不太了解您的问题,但据我了解,您想在函数addVideo() 中选择设置playerVars,但不想将playerVars 定义为输入变量?也许你可以试试这个

    ["start", "end", "loop"].forEach(function (a) {
        if (settings[a]) {
            defaultSettings.playerVars[a] = settings[a];
        }
    });
    // or
    for (let a of ["start", "end", "loop"]) {
      if (settings[a]) defaultSettings.playerVars[a] = settings[a];
    }
    // or
    let optional = ["start", "end", "loop"];
    for (let i = 0; i < optional.length; i++) {
      if (settings[optional[i]]) {
        defaultSettings.playerVars[optional[i]] = settings[optional[i]];
      }
    }
    

    完整代码

    function addVideo(video, settings) {
      const defaultSettings = {
        width: settings.width || 640,
        height: settings.height || 390,
        videoId: video.dataset.id,
        playerVars: {
          autoplay: 1,
          controls: 1,
          showinfo: 1,
          rel: 0,
          iv_load_policy: 3,
          cc_load_policy: 0,
          fs: 0,
          disablekb: 1
        },
        events: {
          "onReady": onPlayerReady,
          "onStateChange": onPlayerStateChange
        }
      };
      ["start", "end", "loop"].forEach(function(a) {
          if (settings[a]) defaultSettings.playerVars[a] = settings[a];
      });
      const updatedSettings = combineSettings(defaultSettings, settings);
      console.log(updatedSettings)
      players.push(new YT.Player(video, updatedSettings));
    }
    

    【讨论】:

    • 谢谢。如果我使用 'for loop' 而不是 .forEach,那部分将如何编写?
    • 非常感谢,非常感谢。
    • 第二个。)一个应该是:for (let a of / or for (var a of. Correct?jsfiddle.net/hzyrfkwb/492
    • forEach 代码中存在 jslint 错误:jsfiddle.net/hzyrfkwb/486“表达式位置出现意外语句 '='。” / settings[a] && (defaultSettings.playerVars[a] = settings[a]) / 如何解决?
    • jslint 对于缩小来说太严格了,通常我使用JSHint 进行代码质量检查,自从你上次发表评论以来,我已经更改了 foreach。
    猜你喜欢
    • 2011-03-10
    • 1970-01-01
    • 2011-12-01
    • 2011-04-16
    • 1970-01-01
    • 2016-12-23
    • 2011-11-15
    • 2015-05-08
    • 1970-01-01
    相关资源
    最近更新 更多