$ .grep匹配后返回属性

时间:2015-10-10 00:33:27

标签: angularjs multidimensional-array

我找不到任何这样做的例子,所以我问你那些聪明的人,如果有一个很好的方法去做我想要的。

尝试将两个数组映射到一起。一个数组有一个ID列表(Foos),另一个数组包含这些ID的所有属性(条形)。想把所有东西放在我的角度控制器中。

这是一个片段。我正在尝试匹配ID并映射到Name属性。

$scope.Foos = $.map($scope.Foos, function (foo) {
                            return {
                                ID: foo.ID,
                                Name: $.grep($scope.bars, function(b){
                                    return b.ID === foo.ID;
                                }).Name,
                                Property: $.grep($scope.bars, function(b){
                                    return b.ID === foo.ID;
                                }).Property
                                };
                            });

我的理解是$ .grep会根据条件返回对象,然后我可以调用该返回对象的属性吗?

更新

Foos是ID(guid) 酒吧是ID(guid),名称&属性

1 个答案:

答案 0 :(得分:10)

$.grep返回一个数组,而不是一个对象,所以为了做你想做的事,你需要做一些像:

Name: $.grep($scope.bars, function(b){
            return b.ID === foo.ID;
      })[0].Name

然而,这里的问题是如果没有匹配,$.grep将返回一个空数组,并且最终会尝试从该空数组中获取第一个元素时抛出错误。

你真的应该首先查看属性,而不是在尝试构建更复杂的对象时

类似的东西:

$scope.Foos = $.map($scope.Foos, function (foo) {
    // first filter the array
    var bars = $.grep($scope.bars, function (b) {
        return b.ID === foo.ID;
    });
    // now test we have result, if not make it ... empty string???
    var name = bars.length ? bars[0].Name : '';

    // do similar for `Property`

    return {
        ID: foo.ID,
        Name: name,
        ......
    };
});

这也可以修改为具有一些实用功能,如getNameFromBars(),并将$.grep放在那里并返回找到的值或默认值。

如果您想摆脱jQuery,可以使用Array.prototype.map()Array.prototype.filter()来替换$.map$.grep

也可以使用$filter