Ich habe eine JSON-Datei mit einigen Daten, auf die ich auf meiner AngularJS-Website zugreifen möchte. Jetzt möchte ich nur ein Objekt aus dem Array erhalten. So möchte ich zum Beispiel Item mit der ID 1.
Die Daten sehen folgendermaßen aus:
{ "results": [
{
"id": 1,
"name": "Test"
},
{
"id": 2,
"name": "Beispiel"
},
{
"id": 3,
"name": "Sample"
}
] }
Ich möchte die Daten mit folgender AngularJS $ http-Funktionalität laden:
$http.get("data/SampleData.json");
was funktioniert. Aber wie kann ich jetzt ein bestimmtes Datenobjekt (nach ID) aus dem Array abrufen, das ich aus $http.get
Erhalte?
Vielen Dank im Voraus für Ihre Hilfe.
Grüße Marc
Die einzige Möglichkeit, dies zu tun, besteht darin, über das Array zu iterieren. Wenn Sie sicher sind, dass die Ergebnisse nach ID sortiert sind, können Sie natürlich eine binäre Suche ausführen
Verwenden der ES6-Lösung
Wenn Sie diese Antwort noch lesen und ES6 verwenden, wurde die find
-Methode in Arrays hinzugefügt. Unter der Annahme der gleichen Sammlung wäre die Lösung:
const foo = { "results": [
{
"id": 12,
"name": "Test"
},
{
"id": 2,
"name": "Beispiel"
},
{
"id": 3,
"name": "Sample"
}
] };
foo.results.find(item => item.id === 2)
Ich würde mich jetzt für diese Lösung entscheiden, da sie weniger an angular oder ein anderes Framework gebunden ist. Reines Javascript.
Winkellösung (alte Lösung)
Ich wollte dieses Problem folgendermaßen lösen:
$filter('filter')(foo.results, {id: 1})[0];
Ein Anwendungsfallbeispiel:
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
Für alle, die sich diesen alten Beitrag ansehen, ist dies derzeit der einfachste Weg, dies zu tun. Es benötigt nur einen AngularJS $filter
. Es ist wie Willemoes Antwort, aber kürzer und leichter zu verstehen.
{
"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" }
WARNUNG
Wie @mpgn sagt, ist dies funktioniert nicht richtig. Dies wird mehr Ergebnisse erzielen. Beispiel: Wenn Sie 3 suchen, fängt dies auch 23
ich persönlich benutze Unterstrich für diese Art von Sachen ... also
a = _.find(results,function(rw){ return rw.id == 2 });
dann wäre "a" die Zeile, die Sie von Ihrem Array wollten, wobei die ID gleich 2 war
Ich möchte nur etwas hinzufügen zu Willemoes Antwort . Derselbe Code, der direkt in HTML geschrieben wurde, sieht folgendermaßen aus:
{{(FooController.results | filter : {id: 1})[0].name }}
Angenommen, "results" ist eine Variable Ihres FooControllers und Sie möchten die Eigenschaft "name" des gefilterten Elements anzeigen.
Sie können ng-repeat
und wähle nur Daten aus, die mit den von dir gesuchten Daten übereinstimmen. ng-show
beispielsweise:
<div ng-repeat="data in res.results" ng-show="data.id==1">
{{data.name}}
</div>
Sie können Ihr Array einfach durchlaufen:
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);
Wenn Sie diese unordentlichen Schleifen nicht schreiben möchten, können Sie nderscore.js oder Lo-Dash verwenden (Beispiel in letzterem):
var doc_id_2 = _.filter(doc.results, {id: 2})[0]
Wenn Sie die Liste der Elemente wie Stadt auf der Grundlage der Status-ID möchten, verwenden Sie
var state_Id = 5;
var items = ($filter('filter')(citylist, {stateId: state_Id }));
Leider (es sei denn, ich täusche mich), denke ich, dass Sie über das Ergebnisobjekt iterieren müssen.
for(var i = 0; i < results.length; i += 1){
var result = results[i];
if(result.id === id){
return result;
}
}
Zumindest auf diese Weise wird die Iteration abgebrochen, sobald die richtige übereinstimmende ID gefunden wurde.
Warum die Situation komplizieren? Dies ist einfach, schreiben Sie eine Funktion wie diese:
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 '';
}
Anwendungsfall:
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'));
ausgabe:
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>
ausgabe: Azərbaycan
Ich weiß, ich bin zu spät, um zu antworten, aber es ist immer besser, zu erscheinen, als überhaupt nicht zu erscheinen :). ES6 Weg, um es zu bekommen:
$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
});
Wenn Sie können, entwerfen Sie Ihre JSON-Datenstruktur, indem Sie die Array-Indizes als IDs verwenden. Sie können Ihre JSON-Arrays sogar "normalisieren", solange Sie problemlos die Array-Indizes als "Primärschlüssel" und "Fremdschlüssel" verwenden, etwa RDBMS. Als solches können Sie in Zukunft sogar Folgendes tun:
function getParentById(childID) {
var parentObject = parentArray[childArray[childID].parentID];
return parentObject;
}
Dies ist die Lösung "By Design". Für Ihren Fall einfach:
var nameToFind = results[idToQuery - 1].name;
Wenn Ihr ID-Format etwa "XX-0001" lautet, dessen Array-Index lautet, können Sie entweder eine Zeichenfolgenmanipulation durchführen, um die ID zuzuordnen; oder es kann nichts dagegen unternommen werden, außer durch den Iterationsansatz.
Der einfache Weg, um (ein) Element aus einem Array über die ID zu erhalten:
Die find () -Methode gibt den Wert des ersten Elements im Array zurück, das die angegebene Testfunktion erfüllt. Andernfalls wird undefined zurückgegeben.
function isBigEnough(element) {
return element >= 15;
}
var integers = [12, 5, 8, 130, 160, 44];
integers.find(isBigEnough); // 130 only one element - first
sie müssen nicht filter () verwenden und das erste Element xx.filter () [0] wie in den obigen Kommentaren abfangen
Dasselbe gilt für Objekte im Array
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);
Wenn Sie mehrere IDs haben, verwenden Sie natürlich die filter () -Methode, um alle Objekte abzurufen. Prost
function isBigEnough(element) {
return element >= 15;
}
var integers = [12, 5, 8, 130, 160, 44];
integers.find(isBigEnough); // 130 only one element - first
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);
Ich würde das Ergebnis-Array mit einem anglejs-Filter wie folgt durchlaufen:
var foundResultObject = getObjectFromResultsList (Ergebnisse, 1);
function getObjectFromResultsList(results, resultIdToRetrieve) {
return $filter('filter')(results, { id: resultIdToRetrieve }, true)[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;
}
}
});
});
Ich bin mir nicht sicher, ob es wirklich gut ist, aber das war hilfreich für mich. Ich musste $ scope verwenden, damit es richtig funktioniert.
verwenden Sie $ timeout und führen Sie eine Funktion aus, um im Array "results" zu suchen
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);
});