如何使用包含属性名称的变量在javascript中从对象中选择属性

时间:2015-02-09 20:50:30

标签: javascript jquery json angularjs

在AngularJS控制器中,我创建了一个发出JSONP请求的函数。此请求返回具有以下格式的JSONP对象。

[{  
  "Domain_1":{  
    "Notes":"This information can be usefull for generic information",
    "Contacts":[  
      {  
        "ContactName":"P. rimary",
        "ContactPhone":"+31 612 273 88"
      }
    ]
  },
  "Domain_2":{  
    "Notes":"This information can be usefull for generic information",
    "Contacts":[  
      {  
        "ContactName":"S. secondary",
        "ContactPhone":"+31 612 273 88"
      }
    ]
  }
}];

在以下函数中发出JSONP请求时,将成功返回该对象。 ($ scope.method和$ scope.domainName在范围级别设置) 我想要实现的是选择与$ scope.domainName中的值匹配的JSON数据的特定部分,并将其分配给范围变量$ scope.domainData。

$scope.fetch = function() {
  $scope.code = null;
  $scope.response = null;

  // Only make JSONP request if domain name is known
  if ($scope.domainName !== null) {
    $http({method: $scope.method, url: $scope.url, timeout: 5000}).
      success(function(data, status) {
        $scope.status = status;
        console.log("Data:") ; console.dir(data) ;
        console.log("Domain Name"  + $scope.domainName) ;
        $scope.domainData = data[$scope.domainName] ;
        console.log("DomainData: ") ; 
        console.dir($scope.domainData) ;
      }).
      error(function(data, status, headers, config) {
        $scope.domainData = null ;
        $scope.status = status;  
        console.log("$scope.fetch failed" + $scope.status + " :: " + data) ;       
      });
  } else {
      console.log("Shame... nothing to do..... ") ;
  }
};

执行代码时,域名为" Domain_1"和数据包含(显示在控制台中);

0: Object
  Domain_1: Object
    Contacts: Array[1]
      0: Object 
        ContactName:"P. rimary"
        ContactPhone:"+31 612 273 88"
...

但$ scope.domainData未定义。如何使这个选择正常工作?

2 个答案:

答案 0 :(得分:1)

您的响应对象似乎是顶级的数组,基于封装的方括号。这意味着您将无法使用域名直接取消引用它。解决这个问题的一种方法是成功函数中的以下内容:

$scope.domainData = data[0][$scope.domainName];

当然,如果您始终确定您的响应对象是长度为1的数组(如您的示例中所示),则建议对0进行硬编码。如果情况并非总是如此,那么您可能必须实现某种迭代遍历来寻找匹配的属性。

答案 1 :(得分:0)

要访问响应中的数据,您应该访问响应的数据属性。

...
$http({method: $scope.method, url: $scope.url, timeout: 5000}).
  success(function(response, status) {
  ...
  # With the latest versions of angularJs (I don't know in which
  # version was that), the data is in the
  # response's data property
  $scope.domainData = response.data[$scope.domainName] ;
  ...