我有一个JSON文件,其中包含我想在AngularJS网站上访问的一些数据。现在我想要的是从数组中只获取一个对象。所以我想要例如ID为1的项目。
数据如下所示:
{ "results": [
{
"id": 1,
"name": "Test"
},
{
"id": 2,
"name": "Beispiel"
},
{
"id": 3,
"name": "Sample"
}
] }
我想用AngularJS $ http功能加载数据,如下所示:
$http.get("data/SampleData.json");
哪个有效。但是,我现在如何从$http.get
获得的数组中获取特定数据对象(通过id)?
提前感谢您的帮助。
电贺 马克
答案 0 :(得分:239)
使用ES6解决方案
对于仍在阅读此答案的人,如果您使用的是ES6,则会在数组中添加find
方法。因此,假设相同的集合,解决方案是:
const foo = { "results": [
{
"id": 12,
"name": "Test"
},
{
"id": 2,
"name": "Beispiel"
},
{
"id": 3,
"name": "Sample"
}
] };
foo.results.find(item => item.id === 2)
我现在完全采用这种解决方案,因为它与角度或任何其他框架无关。纯粹的Javascript。
角度解决方案(旧解决方案)
我的目标是通过执行以下操作来解决此问题:
$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);
}]);
答案 1 :(得分:26)
对于任何看过这篇旧帖子的人来说,这是目前最简单的方法。它只需要一个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所说,无法正常运行。这将获得更多结果。 示例: 当您搜索3时,这也会捕获23
答案 2 :(得分:25)
我个人使用下划线来表达这种东西......所以
a = _.find(results,function(rw){ return rw.id == 2 });
然后“a”将是您想要的数组,其中id等于2
答案 3 :(得分:16)
我只想向Willemoes answer添加内容。 直接在HTML中编写的相同代码如下所示:
{{(FooController.results | filter : {id: 1})[0].name }}
假设"结果"是你的FooController的一个变量,你想显示" name"已过滤项目的属性。
答案 4 :(得分:12)
您可以使用ng-repeat
并仅在数据与您要查找的内容匹配时选择数据ng-show
例如:
<div ng-repeat="data in res.results" ng-show="data.id==1">
{{data.name}}
</div>
答案 5 :(得分:9)
你可以循环遍历你的数组:
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]
答案 6 :(得分:8)
如果您想要基于州ID的城市项目列表,请使用
var state_Id = 5;
var items = ($filter('filter')(citylist, {stateId: state_Id }));
答案 7 :(得分:7)
不幸的是(除非我弄错了),我认为你需要迭代结果对象。
for(var i = 0; i < results.length; i += 1){
var result = results[i];
if(result.id === id){
return result;
}
}
至少这样一旦找到正确的匹配id,它就会突破迭代。
答案 8 :(得分:5)
为什么情况复杂化?这很简单,写一些这样的函数:
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ı
答案 9 :(得分:4)
执行此操作的唯一方法是迭代数组。显然,如果您确定结果按ID排序,则可以执行binary search
答案 10 :(得分:4)
$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
答案 11 :(得分:2)
如果可以,可以通过将数组索引用作ID来设计JSON数据结构。只要您将数组索引用作“主键”和“外键”(如RDBMS)就没有问题,您甚至可以“规范化”JSON数组。因此,将来你甚至可以这样做:
function getParentById(childID) {
var parentObject = parentArray[childArray[childID].parentID];
return parentObject;
}
这是解决方案“按设计”。对于您的情况,只需:
var nameToFind = results[idToQuery - 1].name;
当然,如果您的ID格式类似“XX-0001”,其数组索引为 0 ,那么您可以执行一些字符串操作来映射身份证;除非通过迭代方法,否则无法做任何事情。
答案 12 :(得分:2)
我知道我来不及回答,但总是更好地出现而不是完全露面:)。 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
});
答案 13 :(得分:1)
通过id从数组中获取(一个)元素的简单方法:
find()方法返回数组中第一个满足提供的测试函数的元素的值。否则返回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
&#13;
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);
&#13;
答案 14 :(得分:0)
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;
}
}
});
});
不确定它是否真的很好,但这对我有帮助.. 我需要使用$ scope来使其正常工作。
答案 15 :(得分:0)
使用$ timeout并运行一个函数来搜索“results”数组
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);
});
答案 16 :(得分:0)
我会使用像这样的angularjs过滤器迭代结果数组:
var foundResultObject = getObjectFromResultsList(results,1);
function getObjectFromResultsList(results, resultIdToRetrieve) {
return $filter('filter')(results, { id: resultIdToRetrieve }, true)[0];
}