Angularjs 角度控制器中按顺序和最后一个排列的数组组

Angularjs 角度控制器中按顺序和最后一个排列的数组组,angularjs,model-view-controller,Angularjs,Model View Controller,我的数组看起来像这样 var List = [ {qid: 1, ID: 1, text: "XXX",...}, {qid: 1, ID: 2, text: "XXX",...}, {qid: 1, ID: 3, text: "XXX",...}, {qid: 2, ID: 4, text: "XXX",...}, {qid: 2, ID: 5, text: "XXX",...}, {qid: 3, ID: 6, text: "XXX",...},

我的数组看起来像这样

var List = [
   {qid: 1, ID: 1, text: "XXX",...},
   {qid: 1, ID: 2, text: "XXX",...},
   {qid: 1, ID: 3, text: "XXX",...},
   {qid: 2, ID: 4, text: "XXX",...},
   {qid: 2, ID: 5, text: "XXX",...},
   {qid: 3, ID: 6, text: "XXX",...}, 
   {qid: 3, ID: 7, text: "XXX",...}, 
   {qid: 3, ID: 8, text: "XXX",...}, 
];
我想查询数组,以便最终列表如下所示

var FinalList = [
   {qid: 1, ID: 3, text: "XXX",...},
   {qid: 2, ID: 5, text: "XXX",...},
   {qid: 3, ID: 8, text: "XXX",...}, 
];
qid可以有多个ID,但最后一个条目将是为FinalList[]数组选择的条目

我想在qid上使用类似group by的东西,并在angularcontroller.js中根据qid输入最后一行

我尝试使用reduce函数,但它并没有给出我想要的

我刚开始使用angularjs一个月了,非常感谢您的帮助

补充:

我试过这么做

angular.forEach($scope.selectedList, function (item) {                

    var found = $filter('filter')($scope.selectedList, { QuesID: item.qid});
    $scope.FinalList .push(found[found.length - 1]);

    $scope.List = $scope.List .filter(function (o1) {
        return !$scope.List.some(function (o2) {
            return o1.qid=== o2.qid;
        });
    });
});

我得到的是第一个问题,而不是随后的问题,这是一个Javascript问题,而不是angularJS问题。 好的,下面是:

首先对数组排序:(积分:)

循环遍历数组并获得结果:(finObjArr将具有所需的输出)

请检查这是否有效


注意:我不确定您是否需要对数组进行排序。如果它已经按照要求的顺序出现,则无需排序,您可以直接运行forEach。否则,您必须编写一个排序函数,使数组按forEach所需的顺序排列。

这是一个Javascript问题,而不是angularJS问题。 好的,下面是:

首先对数组排序:(积分:)

循环遍历数组并获得结果:(finObjArr将具有所需的输出)

请检查这是否有效


注意:我不确定您是否需要对数组进行排序。如果它已经按照要求的顺序出现,则无需排序,您可以直接运行forEach。否则,您必须编写一个排序函数,以使数组符合forEach所需的顺序。您可以使用
reduce
map
的组合来解决此问题

首先使用
reduce
将数组按
qid
分组:

var grouped = List.reduce(function(agg, x){
    (agg[x['qid']] = agg[x['qid']] || []).push(x);
    return agg;
}, {});
然后将该组的值与ID最高的元素进行映射。您可以使用此映射中的另一个
reduce
查找具有最高
ID
的元素:

var result = Object.values(grouped).map(function(grp){
   return grp.reduce(function(a, b){
       return a['ID'] > b['ID'] ? a : b;
   });
});
我认为这是最干净的解决方案


您可以结合使用
reduce
map
来解决此问题

首先使用
reduce
将数组按
qid
分组:

var grouped = List.reduce(function(agg, x){
    (agg[x['qid']] = agg[x['qid']] || []).push(x);
    return agg;
}, {});
然后将该组的值与ID最高的元素进行映射。您可以使用此映射中的另一个
reduce
查找具有最高
ID
的元素:

var result = Object.values(grouped).map(function(grp){
   return grp.reduce(function(a, b){
       return a['ID'] > b['ID'] ? a : b;
   });
});
我认为这是最干净的解决方案


它过滤fqid=1,但不过滤qid 2,3,4i。我使用您提供的相同数组对其进行了测试,它正常工作。你能给出你使用的数组吗?普朗克:谢谢你的帮助,维杰。我在寻找索姆,沿着@Nikolaj Dam Larsen的回答。但我已经使你的回答有用了。谢谢你,小伙子,我能帮上忙@nikolaj的答案显然更简洁,代码更少。它过滤fqid=1,但不适用于qid 2,3,4i。我使用您提供的相同数组对其进行了测试,它正常工作。你能给出你使用的数组吗?普朗克:谢谢你的帮助,维杰。我在寻找索姆,沿着@Nikolaj Dam Larsen的回答。但我已经使你的回答有用了。谢谢你,小伙子,我能帮上忙@尼古拉的答案显然更简洁,代码更少。
var result = Object.values(grouped).map(function(grp){
   return grp.reduce(function(a, b){
       return a['ID'] > b['ID'] ? a : b;
   });
});