循环遍历JavaScript对象和子对象

循环遍历JavaScript对象和子对象,javascript,arrays,object,Javascript,Arrays,Object,我正在尝试通过API的响应进行循环。 到目前为止,我的代码是: async function getStreams(gamename){ let url = `https://api.twitch.tv/kraken/streams/?game=${gamename}`; const response = await fetch(url,{ method: 'GET', headers: headers}); const json = await response.json();

我正在尝试通过API的响应进行循环。 到目前为止,我的代码是:

async function getStreams(gamename){ 
  let url = `https://api.twitch.tv/kraken/streams/?game=${gamename}`;
  const response = await fetch(url,{ method: 'GET', headers: headers});
  const json =  await response.json();
  var test = Object.values(json)
});
测试变量返回一个类似于的对象

原始响应看起来像

由于我感兴趣的所有内容都在
流下
我不确定如何分离每个流,然后检查每个方面,例如
频道.语言

我觉得我几乎受够了以下几点:

Object.values(json).forEach(function(key,index) {
// key: the name of the object key
// index: the ordinal position of the key within the object 
  console.log(key)
});

但是,现在我需要深入研究键-
key.values
key[0]
,诸如此类的东西都不起作用。我需要遍历这个指定键的所有内容,并检查是否
language=='de'
,然后打印整个键/对象。由于
language
标记位于它的另一个子对象
channel
中,因此我不知道该使用什么。

分析这个问题<代码>流是一个对象数组。您可以根据
频道
中的语言道具对其进行过滤

const germanChannels = streams.filter(stream => stream.channel.language === 'de');

Object.values
为您提供值,而不是键(这将是
Object.keys
;有意义吗?)-如果值是对象,您将在第一个参数中获得该对象。因此,如果要从该流对象打印对象if
channel.language==='de'
,则如下所示:

Object.values(json).forEach(function(key,index) {
// key: the name of the object key
// index: the ordinal position of the key within the object 
  console.log(key)
});
Object.streams.values(json).forEach(函数(值){
//值:对象键的**值**
if(value.channel.language=='de')console.log(value);
});

(此外,您希望迭代
属性,而不是JSON本身。)

以下是如何使用Prop Filter实用程序:

让toString=Object.prototype.toString;
//严格对象检查
函数对象(值){
返回toString.call(值)='[object]';
}
//严格数组检查
函数isArray(值){
返回toString.call(值)='[object Array]';
}
函数propPicker(数据={},props=[])){
//支柱参数的类型防护装置
//确保它是一个数组
如果(!isArray(道具)){
抛出新的TypeError('第二个参数必须是数组');
}
//数据参数的类型保护
//确保它是一个对象
如果(!isObject(数据)){
抛出新的TypeError('第一个参数必须是对象');
}
//要返回的对象或结果
让输出={};
//遍历数据
//拾取属性
Object.keys(数据).forEach(key=>{
//将键(属性)添加到要创建的结果
//如果屏幕上有,则返回
//数据对象
if(道具包括(关键)){
输出[键]=数据[键];
}
//递归遍历键(属性)
//如果它是一个对象
else if(isObject(数据[键]){
让selectedProps=propPicker(数据[键],props);
让obj;
//从嵌套对象添加关键点(特性)
//如果数据对象上存在密钥
if(Object.keys(selectedProps.length){
obj={
[键]:选择的道具,
};
}
//将主对象和键合并到
//带有过滤键的嵌套对象
output=Object.assign({},output,obj);
}
});
返回输出;
}
常量streamsObject={
“溪流”:[
{
“_id”:209427714,
“游戏”:“英勇”,
“广播平台”:“直播”,
“社区id”:“,
“社区ID”:[],
“观众”:18874,
“视频高度”:1080,
“平均每平方英尺”:60,
“延迟”:0,
“创建时间”:“2020-08-01T13:30:04Z”,
“is_播放列表”:false,
“流类型”:“活动”,
“预览”:{
“小”:https://static-cdn.jtvnw.net/previews-ttv/live_user_mandatory-80x45.jpg",
“中等”:https://static-cdn.jtvnw.net/previews-ttv/live_user_mandatory-320x180.jpg",
“大”:https://static-cdn.jtvnw.net/previews-ttv/live_user_mandatory-640x360.jpg",
“模板”:”https://static-cdn.jtvnw.net/previews-ttv/live_user_mandatory-{width}x{height}.jpg“
},
“频道”:{
“成熟”:假,
“状态”:“点火系列x强制性.GG杯-第2天-四分之一决赛-NiP 1-1那些家伙”,
“广播语言”:“英语”,
“广播软件”:“,
“显示名称”:“必需”,
“游戏”:“英勇”,
“语言”:“fr”,
“_id”:514026431,
“名称”:“强制性”,
“创建时间”:“2020-04-14T13:33:08.208742Z”,
“更新时间”:“2020-08-01T16:33:34.993381Z”,
“搭档”:没错,
“徽标”:https://static-cdn.jtvnw.net/jtv_user_pictures/ffd17c21-5333-4817-8376-0c0df97e97bb-profile_image-300x300.png",
“视频条幅”:空,
“个人资料横幅”:https://static-cdn.jtvnw.net/jtv_user_pictures/762a158e-4cc9-40a5-9fbd-a3d1bfbb4360-profile_banner-480.png",
“个人资料、旗帜、背景、颜色”:“,
“url”:”https://www.twitch.tv/mandatory",
“视图”:158550,
“追随者”:8280,
“广播机构类型”:“,
“描述”:“欢迎收看Mandatory.GG官方Twitch频道!我们是一个100%的Valorant社区。”,
“私人视频”:假,
“隐私选项已启用”:false
}
},
{
“_id”:209051778,
“游戏”:“英勇”,
“广播平台”:“直播”,
“社区id”:“,
“社区ID”:[],
“观众”:15453,
“视频高度”:1080,
“平均每平方英尺”:60,
“延迟”:0,
“创建时间”:“2020-08-01T12:48:03Z”,
“is_播放列表”:false,
“流类型”:“活动”,
“预览”:{
“小”:https://static-cdn.jtvnw.net/previews-ttv/live_user_zerator-80x45.jpg",
“医学