【问题标题】:Iterate in a javascript subobject with an unknown name [duplicate]迭代具有未知名称的javascript子对象[重复]
【发布时间】:2016-11-10 17:30:54
【问题描述】:

我正在使用 javascript 解析 RSS 新闻。 返回的对象(来自 Yahoo YQL)在 news 对象中包含新闻。

通常,它在这个子对象内:

news.results.item

所以我会正常迭代使用:

news.results.item.forEach

现在,当我加载多个源时,它变得很有趣.. 它可以返回类似的东西

news.results.item (array[10])
news.results.entry (array[10])
news.results.banana (array[10])

我的问题是,当我不知道将返回的命名时,如何在这些条目中进行迭代。有没有一种简单的方法可以将它们全部合并? (使用 jQuery 就可以了)

【问题讨论】:

    标签: javascript


    【解决方案1】:

    您可以遍历news.results 上的所有数组属性:

    var news = {
        results: {
            item: ["a", "b", "c"],
            entry: ["d", "e", "f"],
            banana: ["g", "h", "i"]
        }
    };
    Object.keys(news.results).forEach(function(key) {
        var value = news.results[key];
        if (Array.isArray(value)) {
            value.forEach(function(entry) {
                console.log(entry);
            });
        }
    });

    如果您正在寻找特定的东西并想在找到它时停下来,您可以使用 some 而不是 forEach 或使用嵌套的 find(您需要一个 find polyfill一些浏览器仍然存在)。

    但如果您在搜索之前将它们组合起来,这很容易做到:

    var news = {
        results: {
            item: ["a", "b", "c"],
          entry: ["d", "e", "f"],
            banana: ["g", "h", "i"]
        }
    };
    var all = [];
    Object.keys(news.results).forEach(function(key) {
        var value = news.results[key];
        if (Array.isArray(value)) {
            all.push.apply(all, value);
        }
    });
    all.forEach(function(entry) {
      console.log(entry);
    });

    (有些人会为此使用reduce。我认为在这种累积值从未真正改变的情况下,它会模糊而不是帮助阅读。)

    【讨论】:

      【解决方案2】:

      你可以使用Object.keys()for..of循环

      let news = {
        result: {
          item: [1,2,3],
          entry: [4,5,6],
          banana: [7,8,9]
        }
      }
      
      for (let key of Object.keys(news.result)) {
        console.log(`${key}:`);
        for (let entries of news.result[key]) {
          console.log(entries)
        }
      }

      【讨论】:

      • @T.J.Crowder 不确定您的意思? OP 期望result 对象可能不止一个属性?例如,result 可以包含 itementrybanana?
      • @T.J.Crowder 查看更新后的帖子。
      • 是的,解决了它。注意浏览器对 Object.entries 的支持,这是 ES2017 的事情。
      • @T.J.Crowder 查看更新后的帖子。 Object.keys() 通过调整模式返回预期结果。最初将 Question 解释为只有一个属性会设置在 object。
      【解决方案3】:

      T.J. 指出的更新答案克劳德

      var news = {
        results: {
          item: ["a", "b", "c"],
          entry: ["d", "e", "f"],
          banana: ["g", "h", "i"]
        }
      };
      
      for (var key in news.results) {
        console.log(key + " " + news.results[key])
      
      }

      【讨论】:

      • 这里对 jQuery 的需求。现在是 2016 年。数组有 forEach 好几年了。
      • 数组可以,但对象不支持 forEach
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-25
      • 2013-10-15
      • 2014-04-16
      • 2017-02-28
      • 2011-06-18
      • 2012-09-12
      相关资源
      最近更新 更多