如何将两个集合转换为一个集合

时间:2015-03-11 21:54:59

标签: javascript angularjs

这是一个基本的数据结构问题,因为它是一个具体的实现问题。

我有两个系列:

['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是否已经具备了这样的功能 - 我的问题是我不知道这种技术的用途。我猜在集合论或函数式编程中有一个术语,因为这本质上是一个联盟,然后是一个转换,但函数式编程中的基本术语让我觉得 - 有没有这个名字?

1 个答案:

答案 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
});