Javascript (ExtJS) 遍历对象数组,查找重复项并汇总到新对象中

Javascript (ExtJS) iterate through object array, find duplicates and summarize into new object

我使用 JS (ExtJS) 有一段时间了,我正在尝试执行以下操作, 假设这个对象数组:

Array Tickets:
[0]{ticket: 'TICKET1', associated_val: 'AB'}
[1]{ticket: 'TICKET1', associated_val: 'XY'}
[2]{ticket: 'TICKET1', associated_val: 'CD'}
[3]{ticket: 'TICKET2', associated_val: 'YZ'}
[4]{ticket: 'TICKET2', associated_val: 'EF'}
[5]{ticket: 'TICKET3', associated_val: 'AB'}
[6]{ticket: 'TICKET4', associated_val: null}

我想获取以下内容:

Summarized Array:
[0]{ticket: 'TICKET1', associated_val_array: ['AB', 'XY', 'CD']}
[1]{ticket: 'TICKET2', associated_val_array: ['YZ', 'EF']}
[2]{ticket: 'TICKET3', associated_val_array: ['AB']}
[3]{ticket: 'TICKET4', associated_val_array: []}

我正在尝试查找重复项,但我只想到与此类似的内容:

var summarizedArray = [];
        for (var i = 0; i < data.length -1; i++) {
            if (data[i+1].ticket == data[i].ticket) {
                var myObj = {};
                var associated_val_array =[];
                associated_val_array.push(data[i].associated_val);
                myObj.set('ticket', data[i].ticket);
                myObj.set('associated_val_array', associated_val_array);
                summarizedArray.push(myObj);
            } 
        }

但我对如何使它工作以获得汇总数组有点受阻。

我们将不胜感激。

提前致谢。

你可以这样做

var array = [{
  ticket: 'TICKET1',
  associated_val: 'AB'
}, {
  ticket: 'TICKET1',
  associated_val: 'XY'
}, {
  ticket: 'TICKET1',
  associated_val: 'CD'
}, {
  ticket: 'TICKET2',
  associated_val: 'YZ'
}, {
  ticket: 'TICKET2',
  associated_val: 'EF'
}, {
  ticket: 'TICKET3',
  associated_val: 'AB'
}, {
  ticket: 'TICKET4',
  associated_val: null
}];

var newarray = [],
  tmp = {},
  item;
for (var i = 0; i < array.length; i++) {
  item = array[i];
  if (!tmp[item.ticket]) {
    tmp[item.ticket] = {
      ticket: item.ticket,
      associated_val_array: []
    };
    newarray.push(tmp[item.ticket]);
  }
  if (item.associated_val != null) {
    tmp[item.ticket].associated_val_array.push(item.associated_val);
  }
}

console.log(newarray)

您可以先抢唯一票:

var tickets = data.map(function(obj) {
  return obj.ticket
}).filter(function(ticket, i, xs) {
  return xs.indexOf(ticket) === i
})

然后进行筛选以匹配票 属性 并映射值:

var result = tickets.map(function(ticket) {
  return {
    ticket: ticket,
    associated_val_array: data.filter(function(obj) {
      return obj.ticket === ticket && obj.associated_val != null
    }).map(function(obj) {
      return obj.associated_val
    })
  }
})