通过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