这是一个基本的数据结构问题,因为它是一个具体的实现问题。
我有两个系列:
['One', 'Two', 'Three']
[{'Name': 'Two', 'Time': '12:00'}, {'Name': 'Four', 'Time': '14:30'}]
我想要的是将它们合并到第三个集合中:
[
{'Name': 'One', 'HasTime': false, 'Valid': true },
{'Name': 'Two', 'HasTime': true, 'Valid': true, 'Time': '12:00' },
{'Name': 'Three', 'HasTime': false, 'Valid': true },
{'Name': 'Four', 'HasTime': true, 'Valid': false, 'Time': '14:30' },
]
我可以像在这个伪代码中那样做:
// Pseudo-Code, hence no isOwnProperty and other checks
var r = [];
for(v in one) {
var obj = { Name: v, Valid: true, HasTime: false };
for(t in two) {
if(t.Name === v) {
obj.HasTime = true;
obj.Time = t.Time;
break;
}
}
r.push(obj);
}
for(t in two) {
var valid = false;
for(x in r) {
if(x.Name === t.Name) {
valid = true;
break;
}
}
if(!valid) {
var obj = new { Name: t.name, Valid: false, HasTime: true, Time: t.Time };
r.push(obj);
}
}
return obj;
这似乎效率低下,我想知道Angular是否已经具备了这样的功能 - 我的问题是我不知道这种技术的用途。我猜在集合论或函数式编程中有一个术语,因为这本质上是一个联盟,然后是一个转换,但函数式编程中的基本术语让我觉得 - 有没有这个名字?
答案 0 :(得分:1)
如果需要,您可以将其称为 map-reduce ,因为您基本上首先需要将两个数组转换为统一结构( Map ),然后将它们合并( Reduce )。
然而,它没有什么神奇之处,特别是因为你的结构是完全自定义的,所以你无法避免你的幻化。
你真的不需要减少地图,因为你只有两个数组,但为了让你知道它会是这样的:
var result = [one, two].map(function(arr) {
// transform arr into {Name, Valid, HasTime} items
}).reduce(function(arr1, arr2) {
// merge arr1 and arr2
});