使用angularjs或javascript的两个对象数组的交集

时间:2015-03-04 15:34:38

标签: javascript angularjs

我有list01,如:

var list01 = [
   {
      date: **01/01/2015**,
      statut: [1,2,6],
      name: '**Name X**'
   },
   {
      date: **01/01/2015**,
      statut: [5,6],
      name: '**Name X**'
   },
   {
      date: 01/01/2016,
      statut: [5,6],
      name: 'Name Y'
   },
   ...
]

我想生成list02,其中包含list01

中具有相同名称和日期的所有项目
var list02 = [
   {
      date: 01/01/2015,
      name: 'Name x',
      **nbrItem: 2**
   },
   {
      date: 01/01/2016,
      statut: [5,6],
      name: 'Name Y',
      **nbrItem: 1**
   },
   ...
]

我想要一种更好的方法来解决这个问题

2 个答案:

答案 0 :(得分:2)

请查看this fiddle是否符合您的要求。基本思想是在开始时创建一个空列表,然后遍历原始列表。对于原始列表中的每个项目,查看匹配项是否已存在于新列表中。如果是,请增加nbrItem属性。否则,创建一个新对象。链接小提琴的内容如下所示:

var len = list01.length;
var list02 = [];
for (var i = 0; i < len; i++) {
    var foundMatch = false;
    var len2 = list02.length;
    for (var j = 0; j < len2; j++) {
        if (list02[j].date == list01[i].date && list02[j].name == list01[i].name) {
            foundMatch = true;
            list02[j].nbrItem++;
            break;
        }
    }

    if (!foundMatch) {
        list02.push( {
            date: list01[i].date,
            name: list01[i].name,
            nbrItem: 1
        });
    }
}

Array.prototype.map在这种情况下不太适合,因为你想要一个长度不同于输入的输出。这里显示的方法只使用普通的旧for循环,它适用于所有浏览器,甚至是那些没有map的旧的浏览器。

答案 1 :(得分:2)

编辑:

var list02 = [];
list01.forEach(function(item) {
  var matched = list02.filter(function(filterItem) {
    return filterItem.name==item.name && filterItem.date==item.date
  })
  if(matched.length)
    matched[0].nbrItem++
  else
    list02.push({
      date: item.date, 
      name: item.name, 
      nbrItem: 1
    });
});