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

时间:2015-05-15 03:54:50

标签: javascript arrays extjs

我一直在使用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);
            } 
        }

但我有点阻止如何使这个工作来获得汇总数组。

任何帮助将不胜感激。

提前致谢。

2 个答案:

答案 0 :(得分:2)

您可以执行类似

的操作

&#13;
&#13;
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)
&#13;
&#13;
&#13;

答案 1 :(得分:0)

您可以先获取唯一的门票:

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

然后执行过滤器以匹配ticket属性并映射值:

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
    })
  }
})