111

我有一个 JSON 文件,其中包含一些我想在我的 AngularJS 网站上访问的数据。现在我想要的是从数组中只获取一个对象。所以我想要例如 id 为 1 的项目。

数据如下所示:

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

我想使用 AngularJS $http 功能加载数据,如下所示:

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

这是工作。但是我现在如何从我得到的数组中获取特定的数据对象(通过 id)$http.get

在此先感谢您的帮助。

问候马克

4

17 回答 17

247

使用 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

于 2014-06-24T18:35:40.363 回答
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

于 2015-07-31T19:17:40.477 回答
25

我个人使用下划线来表示这种东西......所以

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

然后“a”将是您想要的数组中 id 等于 2 的行

于 2014-01-23T16:30:40.913 回答
17

我只是想在Willemoes answer中添加一些内容。直接在 HTML 中编写的相同代码如下所示:

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

假设“结果”是您的 FooController 的一个变量,并且您想要显示过滤项目的“名称”属性。

于 2015-04-07T09:03:33.800 回答
12

ng-repeat只有当数据与您正在寻找的数据匹配时,您才能使用和选择数据ng-show ,例如:

 <div ng-repeat="data in res.results" ng-show="data.id==1">
     {{data.name}}
 </div>    
于 2014-05-15T10:03:35.370 回答
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]
于 2013-10-25T12:46:11.853 回答
8

如果您想要基于州 ID 的城市等项目列表,请使用

var state_Id = 5;
var items = ($filter('filter')(citylist, {stateId: state_Id }));
于 2015-08-05T21:48:14.107 回答
7

不幸的是(除非我弄错了),我认为您需要遍历结果对象。

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

至少这样,一旦找到正确的匹配 id,它就会退出迭代。

于 2013-10-25T12:43:49.637 回答
6

为什么要把情况复杂化?这很简单,写一些这样的函数:

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ı
于 2016-09-27T13:47:33.357 回答
4

这样做的唯一方法是遍历数组。显然,如果您确定结果是按 id 排序的,则可以进行二进制搜索

于 2013-10-25T12:48:34.257 回答
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

于 2017-01-27T12:37:41.420 回答
2

如果可以,请使用数组索引作为 ID 来设计 JSON 数据结构。您甚至可以“规范化”您的 JSON 数组,只要您可以毫无问题地将数组索引用作“主键”和“外键”,例如 RDBMS。因此,将来,您甚至可以执行以下操作:

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

这是“按设计”的解决方案。对于您的情况,只需:

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

当然,如果您的 ID 格式类似于"XX-0001",其数组索引为0,那么您可以进行一些字符串操作来映射 ID;否则除了通过迭代方法之外,什么也做不了。

于 2014-03-04T22:52:53.780 回答
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
});
于 2017-01-27T12:45:59.447 回答
2

通过 id 从数组中获取(一个)元素的简单方法:

find() 方法返回数组中满足提供的测试函数的第一个元素的值。否则返回未定义。

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

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

于 2017-07-20T13:32:17.680 回答
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 才能使其正常工作。

于 2015-02-27T16:23:28.040 回答
0

使用 $timeout 并运行一个函数在“结果”数组中搜索

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

    });
于 2015-11-20T07:39:41.710 回答
0

我会使用这样的 angularjs 过滤器遍历结果数组:

var foundResultObject = getObjectFromResultsList(results, 1);

function getObjectFromResultsList(results, resultIdToRetrieve) {
        return $filter('filter')(results, { id: resultIdToRetrieve }, true)[0];
    }
于 2018-06-06T14:02:53.970 回答