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

时间:2013-10-25 12:36:19

标签: javascript arrays angularjs json object

我有一个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)?

提前感谢您的帮助。

电贺 马克

17 个答案:

答案 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);
}]);

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

答案 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.jsLo-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()方法获取所有对象。 干杯

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

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

&#13;
&#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;
&#13;
&#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];
    }