我有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**
},
...
]
我想要一种更好的方法来解决这个问题
答案 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
});
});