使用angularjs或javascript的两个对象数组的交集
我想:使用angularjs或javascript的两个对象数组的交集,javascript,angularjs,Javascript,Angularjs,我想: 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], nam
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**
},
...
]
我想要一个更好的方法来解决这个问题请看我是否做了你想要的。基本思想是在开始时创建一个空列表,然后在原始列表中循环。对于原始列表中的每个项目,请查看新列表中是否已存在匹配的项目。如果是,则增加
nbridem
属性。否则,创建一个新对象。链接小提琴的内脏如下所示:
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
});
}
}
var len=list01.length;
var list02=[];
对于(变量i=0;i
Array.prototype.map
在这种情况下并不适合,因为您希望输出的长度与输入的长度不同。此处显示的方法仅使用普通的old for循环,它适用于所有浏览器,即使是没有编辑映射的真正的旧浏览器:
var list02=[];
列表01.forEach(功能(项目){
var matched=list02.filter(函数filterItem){
返回filterItem.name==item.name&&filterItem.date==item.date
})
如果(匹配的长度)
匹配的[0]。项++
其他的
list02.push({
日期:item.date,
名称:item.name,
项目:1
});
});
“解决此问题的更好方法”。。。比什么好?当前正在做什么?如果您希望克隆对象,可能会对您有所帮助。此外,请定义“更好”-执行速度更快?更容易阅读?谢谢。这对我来说并不明显。我已经编辑了我的问题。list02必须重新组合日期和名称相同的项目我完全重写了我的答案。如果这是你想要的,请告诉我。非常感谢我的朋友,但你必须只在列表中添加具有相同名称和日期的项目02是的,这正是它正在做的,与Austin的答案相同,但他的答案对于大型阵列将更有效。啊,好的,它工作得很好。。。非常感谢。