将一个数组按对象属性分成两部分(AngularJS)

3

我有一个对象数组,这些对象来自表单上的两个不同输入字段。它们由id标识。

第一个字段是id:1,第二个字段是id:2。如何根据它们的id将它们分成两个数组。例如,将id:1的对象存储在array1中,将id:2的对象存储在array2中。我不想硬编码,因为如果创建更多的输入字段,这会使事情变得混乱。

"values":[{"id":"1","description":"123"},
          {"id":"1","description":"456"},
          {"id":"2","description":"456"}]
2个回答

4
在这种情况下,您需要使用groupBy作为筛选器。如果您想了解它的工作原理,请阅读angular-filter#groupby。请记住,您不需要创建新的过滤器或其他模型来处理它,只需使用它即可!这样可以节省时间。但是解决方案非常简单。
var result = $filter("groupBy")(values, 'id');
//this result will return 1: [{"id":"1","description":"123"},{"id":"1","description":"456"}] & 2: [{"id":"2","description":"456"}]
for(var item in result){
   //item return all keys (ids) => 1, 2
   //result[item] return all objects related to a key OR id
   //so you can do anything here
}

有没有办法使“result”成为一个数组而不是一个对象?我知道你可以在值周围包裹[ ],但这会使它成为一个对象的数组... - hellomate
1
如果你考虑到 groupBy,你会发现结果必须是一个对象,但对于你的答案,是的,我们可以转换它...请查看更新。 - Maher

3
您可以使用Set生成唯一id列表。然后,通过array.prototype.reducearray.prototype.filter,您可以动态构建一个对象,用于包装每个id生成的所有数组:

var values = [
 {"id":"1","description":"123"},
 {"id":"1","description":"456"},
 {"id":"2","description":"456"}
];

var ids = [...new Set(values.map(v => v.id))];
var res = ids.reduce((m, o) => (m[`array${o}`] = values.filter(v => v.id === o), m), {});

console.log(res);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接