通过AngularJS中的JSON数组获取特定的JSON对象

我有一个JSON文件,其中包含我想在我的AngularJS网站上访问的一些数据。 现在我想要的只是从数组中获取一个对象。 所以我喜欢例如ID为1的项目。

数据如下所示:

{ "results": [ { "id": 1, "name": "Test" }, { "id": 2, "name": "Beispiel" }, { "id": 3, "name": "Sample" } ] } 

我想要像这样加载AngularJS $ httpfunction的数据:

$http.get("data/SampleData.json");

这是工作。 但是我怎么能从$http.get获得的数组中获得一个特定的数据对象(通过id)?

在此先感谢您的帮助。

问候马克

唯一的方法是迭代数组。 很明显,如果你确定结果是按IDsorting的,你可以做一个二进制search

使用ES6解决scheme

对于那些仍在阅读这个答案的人来说,如果你正在使用ES6, find方法被添加到数组中。 所以假设相同的集合,解决scheme是:

 const foo = { "results": [ { "id": 12, "name": "Test" }, { "id": 2, "name": "Beispiel" }, { "id": 3, "name": "Sample" } ] }; foo.results.find(item => item.id === 2) 

我现在完全去找这个解决scheme,因为它更less与angular度或任何其他框架绑定。 纯Javascript。

angular度解决scheme(旧解决scheme)

我的目标是通过以下方式来解决这个问题:

 $filter('filter')(foo.results, {id: 1})[0]; 

用例示例:

 app.controller('FooCtrl', ['$filter', function($filter) { var foo = { "results": [ { "id": 12, "name": "Test" }, { "id": 2, "name": "Beispiel" }, { "id": 3, "name": "Sample" } ] }; // We filter the array by id, the result is an array // so we select the element 0 single_object = $filter('filter')(foo.results, function (d) {return d.id === 2;})[0]; // If you want to see the result, just check the log console.log(single_object); }]); 

Plunker: http ://plnkr.co/edit/5E7FYqNNqDuqFBlyDqRh?p=preview

对于任何人看这个旧post,这是目前最简单的方法。 它只需要一个AngularJS $filter 。 它就像Willemoes的答案,但更短,更容易理解。

 { "results": [ { "id": 1, "name": "Test" }, { "id": 2, "name": "Beispiel" }, { "id": 3, "name": "Sample" } ] } var object_by_id = $filter('filter')(foo.results, {id: 2 })[0]; // Returns { id: 2, name: "Beispiel" } 

警告

正如@mpgn所说,这不能正常工作 。 这将获得更多的结果。 例如: 当你search3时,这也会捕捉到23

我个人使用下划线这种东西…所以

 a = _.find(results,function(rw){ return rw.id == 2 }); 

那么“a”将是你想要的数组,其中ID等于2的行

我只是想添加一些Willemoes的答案 。 直接在HTML中编写的相同代码将如下所示:

 {{(FooController.results | filter : {id: 1})[0].name }} 

假设“结果”是您的FooController的variables,并且您想要显示已过滤项目的“名称”属性。

只有当数据与你正在使用的ng-show相匹配时才能使用ng-repeat和pick数据,例如:

  <div ng-repeat="data in res.results" ng-show="data.id==1"> {{data.name}} </div> 

你可以循环你的数组:

 var doc = { /* your json */ }; function getById(arr, id) { for (var d = 0, len = arr.length; d < len; d += 1) { if (arr[d].id === id) { return arr[d]; } } } var doc_id_2 = getById(doc.results, 2); 

如果你不想写这个混乱的循环,你可以考虑使用underscore.js或Lo-Dash (后者的例子):

 var doc_id_2 = _.filter(doc.results, {id: 2})[0] 

如果你想根据国家编号的城市项目列表,然后使用

 var state_Id = 5; var items = ($filter('filter')(citylist, {stateId: state_Id })); 

不幸的是(除非我错了),我认为你需要迭代结果对象。

 for(var i = 0; i < results.length; i += 1){ var result = results[i]; if(result.id === id){ return result; } } 

至less这样,只要find正确的匹配id,就会跳出迭代。

为什么复杂的情况? 这是简单的写这样的一些function:

 function findBySpecField(data, reqField, value, resField) { var container = data; for (var i = 0; i < container.length; i++) { if (container[i][reqField] == value) { return(container[i][resField]); } } return ''; } 

用例:

 var data=[{ "id": 502100, "name": "Bərdə filialı" }, { "id": 502122 "name": "10 saylı filialı" }, { "id": 503176 "name": "5 sayli filialı" }] console.log('Result is '+findBySpecField(data,'id','502100','name')); 

输出:

 Result is Bərdə filialı 
 $scope.olkes = [{'id':11, 'name':'---Zəhmət olmasa seçim edin---'}, {'id':15, 'name':'Türkyə'}, {'id':45, 'name':'Azərbaycan'}, {'id':60, 'name':'Rusya'}, {'id':64, 'name':'Gürcüstan'}, {'id':65, 'name':'Qazaxıstan'}]; <span>{{(olkes | filter: {id:45})[0].name}}</span> 

输出:Azərbaycan

如果可以的话,通过使用数组索引作为ID来devise你的JSON数据结构。 你甚至可以“正常化”你的JSON数组,只要你没有问题使用数组索引作为“主键”和“外键”,就像RDBMS。 因此,未来,你甚至可以做这样的事情:

 function getParentById(childID) { var parentObject = parentArray[childArray[childID].parentID]; return parentObject; } 

这是“按devise”的解决scheme。 对于你的情况,只需:

 var nameToFind = results[idToQuery - 1].name; 

当然,如果你的ID格式是数组索引为0的 “XX-0001” ,那么你可以做一些string操作来映射ID; 否则除了通过迭代方法之外,什么都不能做。

我知道我为时已晚,但总是performance出来,而不是显示出来:)。 ES6的方式来得到它:

 $http.get("data/SampleData.json").then(response => { let id = 'xyz'; let item = response.data.results.find(result => result.id === id); console.log(item); //your desired item }); 
  projectDetailsController.controller('ProjectDetailsCtrl', function ($scope, $routeParams, $http) { $http.get('data/projects.json').success(function(data) { $scope.projects = data; console.log(data); for(var i = 0; i < data.length; i++) { $scope.project = data[i]; if($scope.project.name === $routeParams.projectName) { console.log('project-details',$scope.project); return $scope.project; } } }); }); 

不知道是否真的很好,但这对我有帮助..我需要使用$范围使其正常工作。

使用$超时并运行一个函数来search“结果”数组

 app.controller("Search", function ($scope, $timeout) { var foo = { "results": [ { "id": 12, "name": "Test" }, { "id": 2, "name": "Beispiel" }, { "id": 3, "name": "Sample" } ] }; $timeout(function () { for (var i = 0; i < foo.results.length; i++) { if (foo.results[i].id=== 2) { $scope.name = foo.results[i].name; } } }, 10); }); 

通过id从数组中获取(一个)元素的简单方法:

find()方法返回数组中第一个满足提供的testing函数的元素的值。 否则返回undefined。

 function isBigEnough(element) { return element >= 15; } var integers = [12, 5, 8, 130, 160, 44]; integers.find(isBigEnough); // 130 only one element - first 

你不需要使用filter()并像上面的注释一样捕获第一个元素xx.filter()[0]

数组中的对象一样

 var foo = { "results" : [{ "id" : 1, "name" : "Test" }, { "id" : 2, "name" : "Beispiel" }, { "id" : 3, "name" : "Sample" } ]}; var secondElement = foo.results.find(function(item){ return item.id == 2; }); var json = JSON.stringify(secondElement); console.log(json); 

当然,如果你有多个id,那么使用filter()方法来获取所有的对象。 干杯

 function isBigEnough(element) { return element >= 15; } var integers = [12, 5, 8, 130, 160, 44]; integers.find(isBigEnough); // 130 only one element - first