使用javascript基于一个公共属性对多个数组进行分组

时间:2017-05-30 05:53:54

标签: javascript arrays

我有多个数组由具有不同属性的人组成。像

这样的东西
r[0] = {name: "john", phone: 123, industry: "food" }
r[1] = {name: "moe", phone: 333, industry: "feed"}
r[2] = {name: "mark", phone: 222, industry: "food"}
r[i] = ...

如何使用javascript循环遍历此数组,然后将结果排序为数组常用属性,比如行业,这样结果就像

food[["john", 123],["mark", 222]] 

feed[["mark", 333]]

现在我可以得到像

这样的结果
food[["john", 123]]

feed[["moe", 333]]

food[["mark", 222]]

3 个答案:

答案 0 :(得分:1)

您可以使用一个对象来收集所有行业分组的项目,并迭代给定的密钥,并使用原始数组中的数据进行输出。



var array = [{ name: 'john', phone: 123, industry: 'food' }, { name: 'moe', phone: 333, industry: 'feed' }, { name: 'mark', phone: 222, industry: 'food' }],
    groups = {};
    
array.forEach(function (a) {
    groups[a.industry] = (groups[a.industry] || []);
    groups[a.industry].push(a);
});

Object.keys(groups).forEach(function (k) {
    console.log(k);
    groups[k].forEach(function (a) {
        console.log([a.name, a.phone].join(', '));
    });
});




答案 1 :(得分:0)

尝试使用Array#reduce迭代数组并转换为对象,hasOwnProperty()用于查找industry值是否在对象中

var a =[{name: 'john', phone: 123, industry: 'food' }, {name: 'moe', phone: 333, industry: 'feed'},{name: 'mark', phone: 222, industry: 'food'}]
 
 console.log(a.reduce(function(a,b){
if(a.hasOwnProperty(b.industry)){
 a[b.industry].push(b)
 }
 else{
  a[b.industry] =[]
    a[b.industry].push(b)
 }

 return a
 },{}))

答案 2 :(得分:-1)

const byIndustry = yourArray.reduce((categories, person) => {
   if (!categories[person.industry]) {
     categories[person.industry] = [];
   }

   categories[person.industry].push(person);
   return categories;
}, {});

这将导致一个对象具有可用行业作为关键字和给定行业的一系列人员:

{
  food: [{name: 'john'}, {name: 'mark'}]
  ...
}