【问题标题】:What is wrong with this JavaScript foreach loop?这个 JavaScript foreach 循环有什么问题?
【发布时间】:2020-01-24 04:16:54
【问题描述】:
var videos = {
    a: Popcorn("#a"),
    b: Popcorn("#b"),
    c: Popcorn("#c")
}

videos.forEach(function(vid){
    if (vid.media.readyState === 4) {
    vid.currentTime(
      videos.a.currentTime()
    );
  }
}); 

在某些情况下,我正在尝试扩展此 JSFiddle:Synchronizing Playback of Two Videos,以便我可以同时播放任意数量的视频。

此外,我想知道是否有任何方法可以将 foreach 循环应用于数组中的每个元素,除了第 0 个索引中的元素。

【问题讨论】:

  • 对象没有内置的forEach 方法。在您提供的链接中,他们正在做Popcorn.forEach,而不是videos.forEach
  • videos 是一个对象而不是一个数组。 forEach 适用于数组。
  • 您应该使用Object.keys(videos) 来遍历密钥,并使用videos[key] 来访问该项目
  • @adiga: Nitpick: 一些 对象(特别是Array.prototype)确实有forEach 方法。这个没有。 :D

标签: javascript arrays foreach


【解决方案1】:

对象没有 forEach 方法,相反,您可以创建对象键数组并通过键循环访问所有键并检查值,像这样

Object.keys(videos).forEach((vid)=>{
    if (videos[vid].media.readyState === 4) {
        videos[vid].currentTime(
          videos.a.currentTime()
        );
      }
});

【讨论】:

  • Arrays don't have forEach Methodobject ?
  • 我的错,对象没有forEach方法,我做了更新,谢谢
【解决方案2】:

默认情况下,对象字面量的原型上没有定义forEach 方法。这意味着您要么需要自己实现它,要么使用其他方法。要自己实现它,您可以定义一个不可枚举的方法 forEach 作为对象的一部分,该方法将为对象中的每个属性执行回调函数,将值和键传递给回调:

var videos = {
    a: "#a",
    b: "#b",
    c: "#c",
}

Object.defineProperty(videos, 'forEach', {
    enumerable: false,
    value:  function(f) {
      for(const key in this)
        f(this[key], key);
    }
});

videos.forEach(function(value, key) {
  console.log("value:", value, "key:", key);
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多