按字段过滤对象数组

时间:2016-12-11 14:28:03

标签: javascript ecmascript-6

我有一个对象数组,每个对象包含两个类别,其中一个类别代表一个组。

[
  {
    "uuid": 123,
    "group": "test_group"
  },
  {
    "uuid": 321,
    "group": "test_group"
  },
  {
    "uuid": 432,
    "group": "test_group2"
  }
]

我正在寻找生成一个JSON响应,该响应已按组分类。

{
  "objects": [
    {
      "group": "test_group",
      "items": [
        {
          "uuid": 123
        },
        {
          "uuid": 321
        }
      ]
    },
    {
      "group": "test_group2",
      "items": [
        {
          "uuid": 432
        }
      ]
    }
  ]
}

目前我已完成此操作,首先迭代并创建一组所涉及的所有组,然后再次迭代并对其进行适当分组。我想知道是否有更简洁的方法来做这件事,也许是使用ES6中引入的一些新操作符。

2 个答案:

答案 0 :(得分:3)

使用Array#reduce进行迭代,并按组收集项目到Map。使用spread将Map#values转换回数组:

$( '.artist_li1' ).click(function() {
    $( '.artist_content' ).removeClass( "active" );
    $( '.artist_content1' ).addClass( "active" );
}); 

$( '.artist_li2' ).click(function() {
    $( '.artist_content' ).removeClass( "active" );
    $( '.artist_content2' ).addClass( "active" );
}); 

$( '.artist_li3' ).click(function() {
    $( '.artist_content' ).removeClass( "active" );
    $( '.artist_content3' ).addClass.addClass( "active" );
}); 


and so on....

答案 1 :(得分:0)

我不知道有一些新的运算符或数组函数可以让它更容易在ES6中引入,但是你应该能够在一次迭代中完成它:

var arrayLength = myArray.length;
var response = {objects: []};
var groupIndex = {};

for (var i = 0; i < arrayLength; i++) {
  let group = myArray[i].group;
  if (!groupIndex.hasOwnProperty(group)) {
    groupIndex[group] = groupIndex.length;
    response.objects.push({
      group: group,
      items: [
        {uuid: myArray[i].uuid}
      ]
  }
  else {
    let index = groupIndex[group];
    response.objects[index].items.push({uuid: myArray[i].uuid});
  }
}