迭代一个名称未知的javascript子对象

时间:2016-11-10 17:30:54

标签: javascript

我使用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很好)

3 个答案:

答案 0 :(得分:2)

您可以遍历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。我认为它会掩盖而不是帮助读取这样的情况,其中累积值永远不会真正改变。)

答案 1 :(得分:0)

您可以使用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)
  }
}

答案 2 :(得分:0)

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])

}