Get specific object by id from array of objects in AngularJS

JavascriptArraysAngularjsJsonObject

Javascript Problem Overview


I have a JSON file containing some data I d like to access on my AngularJS website. Now what I want is to get only one object from the array. So I d like for example Item with id 1.

The data looks like this:

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

I d like to load the data with AngularJS $http functionality like this:

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

which is working. But how can I now get a specific data object (by id) from the array I get from $http.get ?

Thanks in advance for your help.

Greets Marc

Javascript Solutions


Solution 1 - Javascript

Using ES6 solution

For those still reading this answer, if you are using ES6 the find method was added in arrays. So assuming the same collection, the solution'd be:

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

I'd totally go for this solution now, as is less tied to angular or any other framework. Pure Javascript.

Angular solution (old solution)

I aimed to solve this problem by doing the following:

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

A use case example:

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

Solution 2 - Javascript

For anyone looking at this old post, this is the easiest way to do it currently. It only requires an AngularJS $filter. Its like Willemoes answer, but shorter and easier to understand.

{ 
    "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" }

> WARNING > > As @mpgn says, this doesn't work properly. This will catch more results. Example: when you search 3 this will catch 23 too

Solution 3 - Javascript

personally i use underscore for this kind of stuff... so

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

then "a" would be the row that you wanted of your array where the id was equal to 2

Solution 4 - Javascript

I just want to add something to Willemoes answer. The same code written directly inside the HTML will look like this:

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

Assuming that "results" is a variable of your FooController and you want to display the "name" property of the filtered item.

Solution 5 - Javascript

You can use ng-repeat and pick data only if data matches what you are looking for using ng-show for example:

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

Solution 6 - Javascript

You can just loop over your array:

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);

If you don't want to write this messy loops, you can consider using underscore.js or Lo-Dash (example in the latter):

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

Solution 7 - Javascript

If you want the list of items like city on the basis of state id then use

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

Solution 8 - Javascript

Unfortunately (unless I'm mistaken), I think you need to iterate over the results object.

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

At least this way it will break out of the iteration as soon as it finds the correct matching id.

Solution 9 - Javascript

Why complicate the situation? this is simple write some function like this:

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 '';
}

Use Case:

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'));

output:

Result is Bərdə filialı

Solution 10 - Javascript

The only way to do this is to iterate over the array. Obviously if you are sure that the results are ordered by id you can do a binary search

Solution 11 - Javascript

$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>

output: Azərbaycan

Solution 12 - Javascript

If you can, design your JSON data structure by making use of the array indexes as IDs. You can even "normalize" your JSON arrays as long as you've no problem making use of the array indexes as "primary key" and "foreign key", something like RDBMS. As such, in future, you can even do something like this:

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

This is the solution "By Design". For your case, simply:

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

Of course, if your ID format is something like "XX-0001" of which its array index is 0, then you can either do some string manipulation to map the ID; or else nothing can be done about that except through the iteration approach.

Solution 13 - Javascript

I know I am too late to answer but it's always better to show up rather than not showing up at all :). ES6 way to get it:

$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
});

Solution 14 - Javascript

The simple way to get (one) element from array by id:

The find() method returns the value of the first element in the array that satisfies the provided testing function. Otherwise undefined is returned.

function isBigEnough(element) {
    return element >= 15;
}

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

you don't need to use filter() and catch first element xx.filter()[0] like in comments above

The same for objects in 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);

Of course if you have multiple id then use filter() method to get all objects. Cheers

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);

Solution 15 - Javascript

	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;
	    }
		}

	});
});

Not sure if it's really good, but this was helpful for me.. I needed to use $scope to make it work properly.

Solution 16 - Javascript

use $timeout and run a function to search in "results" array

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);

    });

Solution 17 - Javascript

I would iterate over the results array using an angularjs filter like this:

var foundResultObject = getObjectFromResultsList(results, 1);

function getObjectFromResultsList(results, resultIdToRetrieve) {
        return $filter('filter')(results, { id: resultIdToRetrieve }, true)[0];
    }

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionmooonliView Question on Stackoverflow
Solution 1 - JavascriptWillemoesView Answer on Stackoverflow
Solution 2 - JavascriptTillman32View Answer on Stackoverflow
Solution 3 - JavascriptJason BoernerView Answer on Stackoverflow
Solution 4 - JavascriptEnaView Answer on Stackoverflow
Solution 5 - JavascriptJames Kuta SimiyuView Answer on Stackoverflow
Solution 6 - JavascriptkamituelView Answer on Stackoverflow
Solution 7 - JavascriptAli AdraviView Answer on Stackoverflow
Solution 8 - JavascriptsimonlchildsView Answer on Stackoverflow
Solution 9 - JavascriptMusaView Answer on Stackoverflow
Solution 10 - JavascriptAntonio E.View Answer on Stackoverflow
Solution 11 - JavascriptCelal MuhtarView Answer on Stackoverflow
Solution 12 - JavascriptAntonio OoiView Answer on Stackoverflow
Solution 13 - JavascriptHitesh KumarView Answer on Stackoverflow
Solution 14 - JavascriptabosancicView Answer on Stackoverflow
Solution 15 - JavascriptJordyView Answer on Stackoverflow
Solution 16 - JavascriptMoein FazeliView Answer on Stackoverflow
Solution 17 - JavascriptabovetempoView Answer on Stackoverflow