【问题标题】:How can i take Values from a JSON array?如何从 JSON 数组中获取值?
【发布时间】:2017-01-25 10:48:37
【问题描述】:

如何从数组 friends 中获取“steamid”?
我做错了什么?
friendslistfriends 真的让我很困惑。

var obj = 
{
	"friendslist": {
		"friends": [
			{
				"steamid": "76561197965254644",
				"relationship": "friend",
				"friend_since": 1427418915
			},
			{
				"steamid": "76561197967483523",
				"relationship": "friend",
				"friend_since": 1483547216
			},
			{
				"steamid": "76561197967658405",
				"relationship": "friend",
				"friend_since": 1431204923
			}
      ]
	}
}
for (var i = 0; i < obj.length; i++) {
  console.log(obj[i].friends['steamid']);
   
}

【问题讨论】:

  • obj.friendslist.friends[0].steamid
  • obj 不是一个可以使用for 迭代的数组。它是一个对象。 friends 是一个数组。
  • @KD WowThanks 有效,但你能解释一下为什么有效吗?
  • @ShadowGR 请在回答您的问题时找到我的答案

标签: javascript arrays json key-value-store


【解决方案1】:

 var obj = 
    {
    	"friendslist": {
    		"friends": [
    			{
    				"steamid": "76561197965254644",
    				"relationship": "friend",
    				"friend_since": 1427418915
    			},
    			{
    				"steamid": "76561197967483523",
    				"relationship": "friend",
    				"friend_since": 1483547216
    			},
    			{
    				"steamid": "76561197967658405",
    				"relationship": "friend",
    				"friend_since": 1431204923
    			}
          ]
    	}
    }
    obj.friendslist.friends.forEach((i) => {
      console.log(i.steamid);
    })

obj.friendslist.friends 返回数组,然后可以循环。数组中的每个值都是一个对象,您需要的属性是 steamid。

【讨论】:

  • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
  • .forEach 比简单的 for 循环好吗?
  • 感谢@bahrep,进行了必要的更改。这实际上是我的第一篇文章,我还是个新手
【解决方案2】:

正如您在评论中要求解释我的回答...

您有一个 JSON 对象,其中包含某些属性,这些属性可能是另一个对象,String/Number/DateArray。因此,要访问对象内部的属性,您必须首先通过其名称直接访问其子项,方法如下。

obj.friendslist

obj["friendslist"]

friendslist 中有另一个孩子,因此您必须通过以下方式访问它:

obj.friendslist.friends

现在您的 friends 属性包含一个数组,您可以使用 for loop 遍历它

for (var i = 0; i < obj.friendslist.friends.length; i++) {
  console.log(obj.friendslist.friends[i]['steamid']);

}

【讨论】:

    【解决方案3】:

    您需要首先访问嵌套的 friends 属性,然后对其进行迭代。

    var friends = obj.friendslist.friends;
    
    for (var i = 0; i < friends.length; i++) {
       console.log(friends[i]['steamid']);
    }
    

    【讨论】:

      【解决方案4】:

      使用 Array map() 方法迭代对象数组以获得特定的键值。

      map() 方法创建一个新数组,其结果是对该数组中的每个元素调用提供的函数。

      工作演示:

      var obj = 
      {
      	"friendslist": {
      		"friends": [
      			{
      				"steamid": "76561197965254644",
      				"relationship": "friend",
      				"friend_since": 1427418915
      			},
      			{
      				"steamid": "76561197967483523",
      				"relationship": "friend",
      				"friend_since": 1483547216
      			},
      			{
      				"steamid": "76561197967658405",
      				"relationship": "friend",
      				"friend_since": 1431204923
      			}
            ]
      	}
      };
      
      var newObj = obj.friendslist.friends.map(function(item) {
          return item.steamid;
      });
      
      console.log(newObj);

      【讨论】:

      • 我想我可以用:newObj.push(obj.friendslist.friends.steamid) 来做到这一点,还是用地图更好?
      • map 将迭代数组的每个元素。你的 newObj.push(obj.friendslist.friends.steamid) 不会这样做..并且 map 是迭代数组而不是 for 循环的更好方法。
      【解决方案5】:

      您拥有的是 Object,带有 friendslist 属性。 该属性也是一个Object,只有一个属性,friends
      friendsArrayObject
      这些对象具有您感兴趣的属性steamid

      但是,您的代码尝试直接迭代 obj,而不是 friendslist 属性。这是因为访问属性的方式与访问数组元素的方式相同:

      obj.property === obj['property']
      

      所以您正在尝试访问obj 的属性0。可以看到,不存在,返回undefined

      你想要的是迭代 friendslist 属性:

      for (var i = 0; i < obj.length; i++) {
          console.log(
              obj. //The base object
              friendslist. //The friendslist property
              friends[i]. //The friends property, iterated
              steamid //Get the steamid
          );
      }
      

      替代方案可以在obj.friendslist.friends上使用Array的通用mapforEach方法,也可以写成obj['friendslist']['friends']

      您可能想了解 javascript 中 ArrayObject 之间的相似之处,以及它们各自的方法。 MDN 是一个很好的地方,但是任何文档都应该足够了。

      【讨论】:

        【解决方案6】:

        获取好友列表对象,然后获取好友数组/列表并对其进行迭代。 对于其中的每个对象,打印 steamid 或对象中的任何内容。

         for (var i = 0; i < obj.friendslist.friends.length ; i++) {
              console.log(obj.friendslist.friends[i].steamid );
         }
        

        【讨论】:

        • 谢谢你,我现在明白了!
        • @jonhid,仅代码答案不是很有用。尝试扩展您的答案。
        • 你是对的,但很明显,我认为这是不言自明的。
        猜你喜欢
        • 2021-11-30
        • 1970-01-01
        • 2021-08-30
        • 1970-01-01
        • 1970-01-01
        • 2013-12-24
        • 1970-01-01
        • 2019-07-26
        • 1970-01-01
        相关资源
        最近更新 更多