Javascript 从JSON对象数组返回特定对象

Javascript 从JSON对象数组返回特定对象,javascript,json,angularjs,angularjs-scope,angular-filters,Javascript,Json,Angularjs,Angularjs Scope,Angular Filters,下面是my services.js的外观: var app = angular.module('starter.services', []) .factory('Studies',function($http,$filter){ var studies = []; $http.get("studies.json").success( function(data){ //st

下面是my services.js的外观:

    var app = angular.module('starter.services', [])


    .factory('Studies',function($http,$filter){
        var studies = [];
        $http.get("studies.json").success(
                function(data){
                    //studies = data;
                    angular.copy(data, studies);
                }
            );
        single_object = $filter('filter')(studies, function (d) {return d.nodeRef === "56e3382b-9a76-48ee-9c14-907e71b7a184";})[0];
        console.log(single_object);
      return {
        all: function(){
          return studies;
        }
    };
    })

如您所见,我对json文件执行get请求,其中包含属性为“nodeRef”的对象恰好是属性。我想根据匹配的noderef筛选出一个特定的对象。目前console.log返回“undefined”,我认为这可能是因为它在加载json文件之前就被调用了。如果有人能提供解决方案,我将不胜感激

您正在执行一个异步请求,并在服务器响应之前启动筛选器,因此您将获得未定义的
,因为此时,您正在对空数组应用筛选器

您应该将筛选器调用移动到
success
块中,以使其按您的需要工作:

var app=angular.module('starter.services',[])


您是对的,控制台显示“未定义”,因为ajax请求之后还没有填充研究。将筛选器和控制台日志移动到.success函数中:

$http.get("studies.json").success(
            function(data){
                //studies = data;
                angular.copy(data, studies);
                single_object = $filter('filter')(studies, function (d)  {return d.nodeRef === "56e3382b-9a76-48ee-9c14-907e71b7a184";})[0];
                console.log(single_object);
            }
        );
此外,我认为你需要承诺在研究完成后更新研究。退房

您将返回承诺,然后在$http.success函数中解析它,如下所示: var deferred=$q.deferred(); .factory('Studies',函数($http、$q、$filter){


把你的过滤逻辑放在
get
回调中。我该怎么做呢?我确实想得到整个json文件,因为我还需要它来执行其他操作,然后我想执行过滤。这里有一件事我不想在回调期间只执行一次过滤。如果我想在JS上运行过滤函数呢从我的控制器多次在数组上执行?这就是为什么我考虑编写另一个返回函数,如all called get:function(noderef),控制器可以通过noderef match调用该函数来返回特定对象请查看我实现承诺的答案。您可以使用.then()运行筛选器在你的生活中起作用controller@user1585869,检查我的更新答案。现在它创建了一个可以从外部调用的函数。您只需要确保元素已加载,如果未加载,它将返回false。但可能您可以假设它们将在从外部调用函数时准备就绪。因此,如果我要调用特定的节点对象从我的控制器到这个服务,比如$scope.x=Studies.get(“noderef_字符串”)我该怎么做呢?.filtered(“noderef_字符串”)改为.get(“noderef_字符串”)。从我的控制器我可以这样做:'$scope.Studies=Studies.all();$scope.x=Studies.get(“56e3382b-9a76-48ee-9c14-907e71b7a184”);'我将在运行筛选器的服务中在return下定义一个get函数。这会起作用吗?您仍然可以使用承诺模式:Studies.all()。然后(function(response){$scope.Studies=response;//以及对$scope.Studies here}执行的任何其他操作);Studies.all()。然后(function(Studies){//这将在所有操作完成后触发})比如说,如果我想返回我的整个studies json数组,我该怎么做?我已经更新了我的答案,显示返回完整的json响应,然后在控制器中进行过滤,并添加注释。如果我想访问整个json数据,该怎么办。类似studies.all()的东西会起作用吗?然后(函数(有效载荷){$scope.studies=payload.data;});会起作用吗?
$http.get("studies.json").success(
            function(data){
                //studies = data;
                angular.copy(data, studies);
                single_object = $filter('filter')(studies, function (d)  {return d.nodeRef === "56e3382b-9a76-48ee-9c14-907e71b7a184";})[0];
                console.log(single_object);
            }
        );
    var studies = [];
    $http.get("studies.json").success(
            function(data){
                //studies = data;
                angular.copy(data, studies);
                //At this point you can filter data as required, or not at all. I would suggest returning the entire JSON response and not filtering here at all, let the controllers filter the data as needed to maintain a layer of separation between controller and service.

                deferred.resolve(studies);
            }
        );

  return {
    all: function(){
      return deferred.promise;
    }
};
//In your controller, or wherever else...
Studies.all().then(function(studies){ //this will fire when everything is all done. The studies variable is a full JSON object returned from the server (See deferred.resolve() in the service class). Filter here accordingly:
$scope.studies = $filter('filter')(studies, function (d) {return d.nodeRef === "56e3382b-9a76-48ee-9c14-907e71b7a184";})[0];
})